如何更改此jquery插件的时区/时间戳?

我正在使用这个名为timeago的插件:timeago.yarp.com

它工作得很好,除了它在看似不同的时区运行。 我住在美国东部(费城时区),当我把确切时间EST放入timeago插件时(比如2011-05-28,13:47:18),它在我的html页面上重印了四个小时。 当我写2011-05-28,17:47:18(比我居住的地方晚4个小时),然后它重印为“不到一分钟前”

这是jquery插件代码:

(function($) { $.timeago = function(timestamp) { if (timestamp instanceof Date) { return inWords(timestamp); } else if (typeof timestamp === "string") { return inWords($.timeago.parse(timestamp)); } else { return inWords($.timeago.datetime(timestamp)); } }; var $t = $.timeago; $.extend($.timeago, { settings: { refreshMillis: 60000, allowFuture: false, strings: { prefixAgo: "added", prefixFromNow: "added", suffixAgo: "ago", suffixFromNow: "from now", seconds: "less than a minute", minute: "about a minute", minutes: "%d minutes", hour: "about an hour", hours: "about %d hours", day: "a day", days: "%d days", month: "about a month", months: "%d months", year: "about a year", years: "%d years", numbers: [] } }, inWords: function(distanceMillis) { var $l = this.settings.strings; var prefix = $l.prefixAgo; var suffix = $l.suffixAgo; if (this.settings.allowFuture) { if (distanceMillis < 0) { prefix = $l.prefixFromNow; suffix = $l.suffixFromNow; } distanceMillis = Math.abs(distanceMillis); } var seconds = distanceMillis / 1000; var minutes = seconds / 60; var hours = minutes / 60; var days = hours / 24; var years = days / 365; function substitute(stringOrFunction, number) { var string = $.isFunction(stringOrFunction) ? stringOrFunction(number, distanceMillis) : stringOrFunction; var value = ($l.numbers && $l.numbers[number]) || number; return string.replace(/%d/i, value); } var words = seconds < 45 && substitute($l.seconds, Math.round(seconds)) || seconds < 90 && substitute($l.minute, 1) || minutes < 45 && substitute($l.minutes, Math.round(minutes)) || minutes < 90 && substitute($l.hour, 1) || hours < 24 && substitute($l.hours, Math.round(hours)) || hours < 48 && substitute($l.day, 1) || days < 30 && substitute($l.days, Math.floor(days)) || days < 60 && substitute($l.month, 1) || days < 365 && substitute($l.months, Math.floor(days / 30)) || years  -0400 return new Date(s); }, datetime: function(elem) { // jQuery's `is()` doesn't play well with HTML5 in IE var isTime = $(elem).get(0).tagName.toLowerCase() === "time"; // $(elem).is("time"); var iso8601 = isTime ? $(elem).attr("datetime") : $(elem).attr("title"); return $t.parse(iso8601); } }); $.fn.timeago = function() { var self = this; self.each(refresh); var $s = $t.settings; if ($s.refreshMillis > 0) { setInterval(function() { self.each(refresh); }, $s.refreshMillis); } return self; }; function refresh() { var data = prepareData(this); if (!isNaN(data.datetime)) { $(this).text(inWords(data.datetime)); } return this; } function prepareData(element) { element = $(element); if (!element.data("timeago")) { element.data("timeago", { datetime: $t.datetime(element) }); var text = $.trim(element.text()); if (text.length > 0) { element.attr("title", text); } } return element.data("timeago"); } function inWords(date) { return $t.inWords(distance(date)); } function distance(date) { return (new Date().getTime() - date.getTime()); } // fix for IE6 suckage document.createElement("abbr"); document.createElement("time"); }(jQuery)); 

我意识到这个问题是非常小的问题,如果我只记得插件工作时间延迟4小时就可以轻松解决,但我仍然想知道答案是否有可能提供。

谢谢!

更新

我要试一试,但我必须加上免责声明,我自己有点模糊,所以我可能错了!

该插件需要ISO 8601格式的时间,其中还包括偏移信息 。 我现在尝试使用插件,这就是我所看到的(在14:42 EDT ,距离测试时间字符串大约3分钟):

  • 当使用尾随Z ,表示祖鲁时间或从UTC偏移0时,插件将其解释为UTC(显然),并且在打印相对时间字符串时,它会考虑您的实际时区。 这导致额外的4小时被添加( EST是UTC-5(跟随DST时的UTC-4,就像现在一样) )。

    2011-05-28T14:39:33Z about 4 hours ago打印

  • 没有使用尾随Z ,插件会根据您的时区解释指定的时间,它似乎工作正常( 只要时间戳的时区和您正在查看此时间戳的时区相同 )。 这与维基百科的文章所说的一致:

    如果没有给出具有时间表示的UTC关系信息,则假定时间是在本地时间。 虽然在同一时区进行通信时假设当地时间可能是安全的,但在用于跨不同时区进行通信时则不明确。 通常最好使用标准符号表示时区(区域指示符)。

    这不是一种推荐的方式,因为从其他地方查看它会搞乱时间,因为时间戳将被解释为该时区的时间戳不正确。

    2011-05-28T14:39:33打印时间为3 minutes ago

  • 当指定尾随Z与时区偏移量(格式为hh:mm ,只有hh似乎被忽略)时,它似乎仍然可以正常工作。

    2011-05-28T14:39:33Z-04:00打印为3 minutes ago

你可以在这里看到一个有效的例子: http//jsfiddle.net/nogoodatcoding/SVgck/


您不应该更改插件本身的时区/偏移量,因为这会导致来自其他时区的访问者看到不正确的值。

  • 一个解决方法是在日期时间字符串中指定时区偏移: 2011-05-28, 13:47:18Z-04:00 – 从某种意义上说,它是一个更完整的时间描述,因为它还包括UTC偏移信息。
  • 根据您生成此页面的方式(如果它不仅仅是静态HTML),另一个选项是修复服务器端代码,使其输出的日期时间字符串为UTC格式 – 如果不是内置的,则为应该能够找到一个库,从当地时区的时间戳转换为UTC。 这就是我见过的网站所做的事情 – 例如,StackOverflow(或Twitter和Facebook)上的时间戳是UTC时间 – 然后根据用户的时区对它们进行不同的格式化。

嘿,我用这个插件。 这不是你必须编辑的JavaScript。 寻找php文件,在wordpress中它被称为’wpTimeAgo.php’它应该是类似的东西。

在该文件中查找:

var $_gmtOffset = '';

在那里添加一个数字,我相信应该做的伎俩。

如果你在.NET世界中使用timeago,你会发现它对它的偏移非常挑剔。 zzz不起作用,它需要是zzz并且应该包括分隔大“Z”和“T”。

例如:

string.Format("{0}Z{1:%zzz}", DateTime.Now.ToString("s"), DateTime.Now);

这显示为:

2013-01-06T12:46:28Z-08:00