自定义角度日期过滤器

时间:2013-06-30 15:12:23

标签: javascript date angularjs

内置的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]。非常好。

1 个答案:

答案 0 :(得分:1)

我认为它是在不稳定的分支中修复的,请查看1.1.5,其中日期(作为字符串)在本地时区而不是UTC中解释。