1

我有一个页面当前正在使用datetime 微格式来显示时间戳,但我只显示了我自己时区的人类可读时间:

<abbr class="published" title="2009-01-09T09:16:00-05:00">
Friday, January 9, 2009 at 9:16 am (EST)</abbr>

我想做的是将 abbr 标记的 innerHTML 重写为相同的格式,但在用户的本地时区中。因此,对于西雅图的读者来说,以上内容应转换为:

<abbr class="published" title="2009-01-09T09:16:00-05:00">
Friday, January 9, 2009 at 6:16 am (PST)</abbr>

我查看了Javascript Date 对象,它允许我获取本地时区偏移量。但我有几个问题:

  1. 我看不到从ISO-8601时间戳创建新 Date 对象的简单方法。(我想如果没有更快的方法,我可以用子字符串或正则表达式解析。)

  2. 我看不到获得时区命名缩写的方法。例如,对于西雅图的读者,我希望时间在末尾附加“(PST)”,否则该用户不清楚时间戳已被转换(特别是如果他是常客并且已经习惯了我的时代是在美国东部标准时间的事实)。

4

2 回答 2

5

这是我的解析 ISO 时间戳的代码:

function isoDateStringToDate (datestr) {
  if (! this.re) {
    // The date in YYYY-MM-DD or YYYYMMDD format
    var datere = "(\\d{4})-?(\\d{2})-?(\\d{2})";
    // The time in HH:MM:SS[.uuuu] or HHMMSS[.uuuu] format
    var timere = "(\\d{2}):?(\\d{2}):?(\\d{2}(?:\\.\\d+)?)";
    // The timezone as Z or in +HH[:MM] or -HH[:MM] format
    var tzre = "(Z|(?:\\+|-)\\d{2}(?:\\:\\d{2})?)?";
    this.re = new RegExp("^" + datere + "[ T]" + timere + tzre + "$");
  }

  var matches = this.re.exec(datestr);
  if (! matches)
    return null;

  var year = matches[1];
  var month = matches[2] - 1;
  var day = matches[3];
  var hour = matches[4];
  var minute = matches[5];
  var second = Math.floor(matches[6]);
  var ms = matches[6] - second;
  var tz = matches[7];
  var ms = 0;
  var offset = 0;

  if (tz && tz != "Z") {
    var tzmatches = tz.match(/^(\+|-)(\d{2})(\:(\d{2}))$/);
    if (tzmatches) {
      offset = Number(tzmatches[2]) * 60 + Number(tzmatches[4]);
      if (tzmatches[1] == "-")
        offset = -offset;
    }
  }

  offset *= 60 * 1000;
  var dateval = Date.UTC(year, month, day, hour, minute, second, ms) - offset;

  return new Date(dateval);
}

不幸的是,它也不处理时区缩写。您必须修改“tzre”表达式以接受字母,而我所知道的在 Javascript 中处理时区缩写的唯一解决方案是有一个查找表,您可以在更改区域时手动更新该表夏令时。

于 2009-01-12T18:59:41.457 回答
0

EcmaScript 正式添加了一个 ISO-8601 样式字符串作为 JavaScript 日期的输入。由于大多数 JS 实现不支持这一点,我为 Date 对象创建了一个包装器,它具有此功能。如果将标题标签设置为以 UTC/GMT/Z/Zulu 偏移量输出,则可以将我的EcmaScript 5 扩展用于 JS 的 Date object

对于要在客户端脚本中使用的 DateTime 值,我通常尝试始终执行以下操作。将日期+时间存储在 UTC 区域中(甚至在数据库中)。在 UTC 区域中传输日期时间。从客户端到服务器,您可以使用上述链接中的 .toISOString() 方法。从服务器到客户端,这相对容易。

通过 jQuery(带扩展名):

$('.published').each(function(){
  var dtm = new Date(this.title);
  if (!isNaN(dtm)) {
    this.text(dtm.toString());
  }
});

我不记得我是否在输入中添加了对非 UTC 日期时间的支持,但考虑它们并不太难。

于 2010-04-13T21:04:47.480 回答