如何在AngularJS中格式化Oracle Timestamp(6)并保留最后三位小数?
解决AngularJS格式化Oracle Timestamp(6) 6位小数精度问题
AngularJS内置的date过滤器仅支持到毫秒级(三位小数),无法直接处理Oracle Timestamp(6)的6位微秒精度。要完整保留并格式化这类时间,需要自定义过滤器实现。
方案一:直接解析Oracle原始时间字符串
如果后端返回的是Oracle原生格式(如07-APR-20 12.37.00.795753000),可以通过自定义过滤器直接拆分解析字符串,避免Date对象截断微秒:
angular.module('yourApp') .filter('dateWithMicro', function() { return function(input) { if (!input) return ''; // 拆分日期与时间部分 const [dateSegment, timeSegment] = input.split(' '); // 映射月份缩写到数字 const monthMap = { JAN: 0, FEB: 1, MAR: 2, APR: 3, MAY: 4, JUN: 5, JUL: 6, AUG: 7, SEP: 8, OCT: 9, NOV: 10, DEC: 11 }; // 解析日期部分:DD-MMM-YY const [day, monthAbbr, year] = dateSegment.split('-'); const fullYear = `20${year}`; const month = String(monthMap[monthAbbr] + 1).padStart(2, '0'); const formattedDay = day.padStart(2, '0'); // 解析时间部分:HH.MM.SS.MICROSECONDS const [hours, minutes, seconds, microFull] = timeSegment.split('.'); const formattedHours = hours.padStart(2, '0'); const formattedMinutes = minutes.padStart(2, '0'); const formattedSeconds = seconds.padStart(2, '0'); // 截取前6位有效微秒 const micro = microFull.substring(0, 6); // 拼接成目标格式 return `${fullYear}-${month}-${formattedDay} ${formattedHours}:${formattedMinutes}:${formattedSeconds}.${micro}`; }; });
在视图中使用:
{{ oracleTimestamp | dateWithMicro }}
方案二:基于ISO格式字符串优化
如果后端可以将Timestamp(6)转换为ISO格式(如2020-04-07T12:37:00.795753Z),过滤器可以更简洁:
angular.module('yourApp') .filter('dateWithMicro', function() { return function(input) { if (!input) return ''; // 拆分日期时间与微秒部分 const [dateTimePart, microPart] = input.split('.'); // 格式化日期时间为yyyy-MM-dd HH:mm:ss const formattedDateTime = new Date(dateTimePart) .toISOString() .slice(0, 19) .replace('T', ' '); // 拼接6位微秒 return `${formattedDateTime}.${microPart.substring(0, 6)}`; }; });
关键注意事项
- 确保后端返回的时间格式稳定,过滤器的解析逻辑需与格式完全匹配;
- JavaScript原生Date对象仅支持毫秒精度,因此必须通过直接截取原始字符串的微秒部分来保留6位精度,避免Date对象截断数据。
内容的提问来源于stack exchange,提问作者user1169587
相关产品推荐
相关产品推荐

