我有一个页面当前正在使用日期时间微格式 http://microformats.org/wiki/datetime-design-pattern显示时间戳,但我只显示我自己的时区的人类可读时间:
<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 日期对象 http://www.w3schools.com/jsref/jsref_obj_date.asp,这使我能够获取本地时区偏移量。但我有几个问题:
我没有看到从一个对象创建一个新的 Date 对象的简单方法ISO-8601 http://microformats.org/wiki/iso-8601时间戳。 (我想如果没有更快的方法,我可以使用子字符串或正则表达式进行解析。)
我没有找到获取时区命名缩写的方法。例如,对于西雅图的读者,我希望时间末尾附加“(PST)”,否则该用户不清楚时间戳是否已转换(特别是如果他是常客并且已经习惯了我的时间是东部时间这一事实)。
这是我的解析 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 中处理时区缩写的唯一解决方案是使用一个查找表,以便在区域发生更改时手动更新该表。夏令时。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)