我有一个网页,目前正在使用的 datetime微格式 以显示时间戳,但我仅表示的人阅读的时间我自己的时区:

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

什么我想要做的就是重写innerHTML的abbr标是相同的格式,但在用户的当地的时区。因此,对于读者在西雅图,上述应转换为:

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

我看了看 Javascript日期对象, ,这让我得到当地的时区抵消。但是我有几个问题:

  1. 我没有看到一个简单的方法来创建一个新的日期的对象,从一个 ISO8601 时间戳。(我想我可以分析与子或regex如果没有更快的方式。)

  2. 我看不到的方式得到命名的缩写时区。例如,读者在西雅图,我希望该时间必须"(PST)"附加到底,否则是不明确的用户的时间戳已经被转换(尤其是如果他是常客,并已成为习惯这样的事实,我的时间都在EST)。

有帮助吗?

解决方案

这里是代码的地雷,分析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是有一个查找表这你保持最新的变化事件的地区夏令时间。

其他提示

写正式加ISO8601风格的字符串作为一个输入一JavaScript日期。由于大多数JS实现不支持这个,我制造了一个包装的日期对象,具有这一功能。如果你设置的标题标记输出UTC/GMT/Z/Zulu偏移,你可以用我的 写5扩展JS的日期对象.

DateTime值,应使用客户端的脚本,我通常尝试总是做以下。储存日期和时间在UTC区(即使在数据库)。发射日期次世界标准的区域。从客户服务器,可以使用。toISOString()方法在上述链接。从服务器的客户,这是相对容易。

通过jQuery(与扩展):

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

我不记得如果我加入支持非utc日期时的输入,但不会太难的帐户。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top