2009-01-12 79 views
1

我当前正在使用的datetime microformat显示时间戳的页面,但我只显示了人类可读的时间为我自己的时区:如何将datetime微格式转换为javascript中的本地时间?

<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 object,这让我得到了当地时区偏移。但是,我有几个问题:

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

  2. 我看不到一种方法来获取时区的指定缩写。例如,对于西雅图的读者,我希望有时间在末尾附加“(PST)”,否则该用户不清楚时间戳已被转换(特别是如果他是一个常客和已经习惯了我的时代是在EST的事实)。

回答

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中的时区缩写的解决方案是有一个查找表,您可以在发生区域更改时手动更新夏令时。

+0

您连续两次使用变量“ms”,使其以前的使用无效。 – 2013-06-09 02:33:55

0

EcmaScript将一个ISO-8601样式字符串的形式正式化为JavaScript日期的输入。由于大多数JS实现不支持这一点,我创建了一个包含Date对象的包装,它具有这种功能。如果将标题标签设置为以UTC/GMT/Z /祖鲁偏移量输出,则可以使用我的EcmaScript 5 extensions for JS's Date object

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

通过jQuery(扩展):

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

我不记得我是否添加了输入非UTC日期时间的支持,但不会太难解释它们。