如何在javascript中将日期时间微格式转换为本地时间?

如何在javascript中将日期时间微格式转换为本地时间?,javascript,timezone,timestamp,microformats,Javascript,Timezone,Timestamp,Microformats,我有一个页面当前正在使用显示时间戳,但我只显示了我自己时区的人类可读时间: <abbr class="published" title="2009-01-09T09:16:00-05:00"> Friday, January 9, 2009 at 9:16 am (EST)</abbr> ,它允许我获取本地时区偏移量。但我有几个问题: 我看不到一个简单的方法来从时间戳创建一个新的日期对象。(如果没有更快的方法,我想我可以使用子字符串或正则表达式进行解析。) 我看不出有什

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

<abbr class="published" title="2009-01-09T09:16:00-05:00">
Friday, January 9, 2009 at 9:16 am (EST)</abbr>
,它允许我获取本地时区偏移量。但我有几个问题:

  • 我看不到一个简单的方法来从时间戳创建一个新的日期对象。(如果没有更快的方法,我想我可以使用子字符串或正则表达式进行解析。)

  • 我看不出有什么办法可以得到时区的缩写。例如,对于西雅图的一位读者,我希望在末尾添加时间“(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中处理时区缩写的唯一解决方案是拥有一个查找表,在区域夏令时发生变化时,您可以手动更新该表。

    以下是我解析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中处理时区缩写的唯一解决方案是有一个查找表,在区域夏令时发生变化时,可以手动更新该表。

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

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

    通过jQuery(带扩展名):


    我不记得我是否在输入中添加了对非utc日期时间的支持,但要解释它们并不难。

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

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

    通过jQuery(带扩展名):

    我不记得我是否在输入中添加了对非utc日期时间的支持,但要解释它们并不难。

    您连续使用了两次变量“ms”,使其以前的使用无效。很好,不应该出现“var ms=0;”。回想起来,我很确定时区匹配正则表达式也缺少零个或一个量词。您连续两次使用变量“ms”,使其以前的用法无效。很好的理解,“var ms=0;”应该根本不存在。回想起来,我很确定时区匹配正则表达式也缺少零或一个量词。
    $('.published').each(function(){
      var dtm = new Date(this.title);
      if (!isNaN(dtm)) {
        this.text(dtm.toString());
      }
    });