内置的Angular日期过滤器将json字符串作为输入,查找时区数据(通过正则表达式),然后以UTC时间返回日期对象。一切都很好 - 我理解需要以UTC格式在服务器上存储日期。
我有一种情况,我只是存储日期部分(没有时区信息),我不希望转换为UTC的日期(“2013-06-30T00:00:00.000”是从服务器返回的日期字符串 - 它正在渲染为2013-06-29 - 这是正确的,因为我的语言环境是GMT-0400(东部夏令时))。
我想创建一个自定义日期过滤器来覆盖Angular现有的日期过滤器,所以不要使用:
date.setUTCFullYear(int(match[1]), int(match[2]) - 1, int(match[3]));
date.setUTCHours(int(match[4]||0) - tzHour, int(match[5]||0) - tzMin, int(match[6]||0), int(match[7]||0));
从第10131-10132行(在v1.0.7中),我希望它使用:
date.setFullYear(int(match[1]), int(match[2]) - 1, int(match[3]));
date.setHours(int(match[4]||0) - tzHour, int(match[5]||0) - tzMin, int(match[6]||0), int(match[7]||0));
我希望能够利用过滤器的所有其他部分(正则表达式,格式化等)。我显然不想更改本机实现,因为这会在我需要 UTC转换的区域中产生很多不良后果。
非常感谢任何协助。
更新:根据@ pkozlowski.opensource,我更新到1.1.5(手动,Nuget只有1.07),它可以根据需要运行。有趣的是,这是新的实现:
function jsonStringToDate(string) {
var match;
if (match = string.match(R_ISO8601_STR)) {
var date = new Date(0),
tzHour = 0,
tzMin = 0,
dateSetter = match[8] ? date.setUTCFullYear : date.setFullYear,
timeSetter = match[8] ? date.setUTCHours : date.setHours;
if (match[9]) {
tzHour = int(match[9] + match[10]);
tzMin = int(match[9] + match[11]);
}
dateSetter.call(date, int(match[1]), int(match[2]) - 1, int(match[3]));
var h = int(match[4]||0) - tzHour;
var m = int(match[5]||0) - tzMin
var s = int(match[6]||0);
var ms = Math.round(parseFloat('0.' + (match[7]||0)) * 1000);
timeSetter.call(date, h, m, s, ms);
return date;
}
return string;
}
如果未定义匹配[8](时区信息),则调用setFull [Year | Hours]而不是setUTCFull [Year | Hours]。非常好。
答案 0 :(得分:1)
我认为它是在不稳定的分支中修复的,请查看1.1.5,其中日期(作为字符串)在本地时区而不是UTC中解释。