AngularJS中如何将SOAP返回的"201804122359+0530"时间戳转为标准格式
解决自定义SOAP时间戳格式转换问题
嘿,我完全懂你遇到的麻烦——这种无分隔符的SOAP时间戳格式确实没法被JavaScript的Date对象或者Angular的date过滤器直接识别,因为它不符合标准的时间字符串规范。不过咱们有两种靠谱的方法来搞定这个转换,看你需求选就行:
方法一:手动解析字符串构建Date对象(支持时区转换)
如果需要后续对日期进行操作,或者要考虑时区偏移的影响,咱们可以先把字符串拆分成各个时间部分,再构建合法的Date对象:
const str_date = "201804122359+0530"; // 用正则匹配提取年、月、日、时、分和时区偏移 const timeMatch = str_date.match(/^(\d{4})(\d{2})(\d{2})(\d{2})(\d{2})([+-]\d{4})$/); if (timeMatch) { const [_, year, month, day, hour, minute, tzOffset] = timeMatch; // 处理时区偏移:转成分钟数(JS Date用分钟数表示时区偏移) const offsetSign = tzOffset.startsWith('+') ? -1 : 1; // UTC转本地需要反向计算 const offsetHours = parseInt(tzOffset.slice(1, 3), 10); const offsetMinutes = parseInt(tzOffset.slice(3, 5), 10); const totalOffset = offsetSign * (offsetHours * 60 + offsetMinutes); // 用UTC时间构建Date,再调整时区偏移得到正确时间 const date = new Date(Date.UTC(year, month - 1, day, hour, minute) + totalOffset * 60 * 1000); // 格式化为"DD MM yyyy HH:mm" const formattedDate = `${date.getDate().toString().padStart(2, '0')} ${(date.getMonth() + 1).toString().padStart(2, '0')} ${date.getFullYear()} ${date.getHours().toString().padStart(2, '0')}:${date.getMinutes().toString().padStart(2, '0')}`; $scope.current_time = formattedDate; }
方法二:直接字符串截取拼接(简单高效,无需Date对象)
如果只是要格式化显示,不需要后续日期操作,直接截取字符串拼接是最快的方式:
const str_date = "201804122359+0530"; // 按固定位置截取各部分 const day = str_date.slice(6, 8); const month = str_date.slice(4, 6); const year = str_date.slice(0, 4); const hour = str_date.slice(8, 10); const minute = str_date.slice(10, 12); // 拼接成目标格式 const formatted_date = `${day} ${month} ${year} ${hour}:${minute}`; $scope.current_time = formatted_date;
Angular项目优化:自定义过滤器
在Angular里,推荐写个自定义过滤器来复用这个转换逻辑,这样模板里可以直接调用:
angular.module('yourCordovaApp').filter('soapDate', function() { return function(input) { if (!input) return ''; // 这里用上面的字符串截取法,或者时区解析法 const day = input.slice(6, 8); const month = input.slice(4, 6); const year = input.slice(0, 4); const hour = input.slice(8, 10); const minute = input.slice(10, 12); return `${day} ${month} ${year} ${hour}:${minute}`; }; });
然后在模板里直接使用:
<p>当前时间:{{ str_date | soapDate }}</p>
为什么原生方法会报错?
JavaScript的Date构造函数只支持特定格式的时间字符串(比如ISO 8601格式的2018-04-12T23:59:00+05:30),你的时间戳没有分隔符,时区部分也没有冒号,所以无法被解析。Angular的date过滤器本质上也是依赖Date对象,自然也会抛出无效日期的错误。
内容的提问来源于stack exchange,提问作者Sachin Biradarpatil
相关产品推荐
相关产品推荐

