关于javascript:在浏览器上本地化日期?

Localize dates on a browser?

假设我有一个可以用文化不变格式表示的日期(ISO 8601)。

我将于2009年7月6日下午3点54分在巴黎,当地时间下午5:54在巴黎观察夏令时。

2009-07-06T15:54:12.000+02:00

OK ...是否有任何隐藏的标记宝石会告诉浏览器将该字符串转换为它的本地化版本?

最接近的解决方案是使用Javascript的Date.prototype.toLocaleString()。它确实做得很好,但迭代很多日期可能很慢,而且它依赖于Javascript。

是否有任何HTML,CSS,XSLT或其他语义标记,浏览器将识别并自动呈现正确的本地化字符串?

编辑:

我目前使用的方法是用本地化的字符串替换HTML元素的文本:

从...开始:

1
<span class="date">2009/07/06 15:54:12 GMT</span>

使用Javascript(使用jQuery):

1
2
3
4
5
6
7
8
var dates = $("span.date", context);
// use for loop instead of .each() for speed
for(var i=0,len=dates.length; i < len; i++) {
    // parse the date
    var d = new Date(dates.eq(i).text());
    // set the text to the localized string
    dates.eq(i).text(d.toLocaleString());
}

从实际的角度来看,当Javascript运行时,它会使文本"闪烁"到新值,我不喜欢它。

从原则的角度来看,我不明白为什么我们需要这样做 - 浏览器应该能够本地化标准的东西,如货币,日期,数字,只要我们这样标记它。

后续问题:为什么浏览器/ Web没有这么简单的功能 - 采用标准数据项,并根据客户端的设置进行格式化?


Dojo有一些非常好的日期和货币本地化。使用此方法还允许您选择不同的格式(例如:短日期与长日期)并强制区域设置。


我在我的网站上使用toLocaleString(),我从来没有遇到过它的速度问题。如何将服务器日期输入Date对象?解析?

我在显示日期之前添加了一个注释节点,就像服务器看到它一样。在注释节点内部是该帖子的日期/时间,作为自纪元以来的毫秒数。在Rails中,例如:

1
<!--<%= post.created_at.to_i * 1000 %>-->

如果他们启用了JS,我使用jQuery来获取这些节点,获取注释的值,然后:

1
2
3
var date = new Date();
date.setTime(msFromEpoch);
// output date.toLocaleString()

如果他们没有启用JS,他们可以随意进行转换。

如果您正在尝试解析ISO时间,这可能是您缓慢的原因。还有,我们在谈多少日期?


使用HTML无法做到这一点,它没有可以做出任何类似决定的智能标记。它是严格的表现形式。不过,我确实想知道HTML5是否有类似这样的标签......

无论如何,我看到它的方式,你有3个选择:

  • 坚持Javascript方式。在这个网站上有关于它的更多细节的问题,例如如何以用户的语言环境格式和时间偏移显示日期/时间?以及如何确定网络用户的时区?

  • 尝试使用地理位置。也就是说,您的服务器端脚本会在用户首次访问页面时触发对其中一个地理定位器服务的请求,以尝试猜测用户所在的位置。这种情况的缺点是,大约10%的时间都是错误的,所以它并不比Javascript会让你获得的市场份额好......(总而言之,这不是一个非常好的方法。 ..)

  • 问用户!你会发现大多数想要为你展示量身定制体验的网站都会问你这种事情,因为这是不可能知道的。作为一个整洁的后备,你可以围绕


  • 不幸的是,没有。

    HTML&amp; CSS严格用于演示,因此,没有内置的"智能"来改变事物的显示方式。

    您最好的选择是使用服务器端语言(如.NET,Python等)以您希望向用户显示的格式将日期发布到HTML中。


    应该在HTTP标头上发送语言和用户的语言环境。您可以使用它们创建正确的日期格式服务器端以显示给用户。但是,这通常是不合需要的,因为许多用户完全忽略其操作系统和/或浏览器中的区域设置。所以,你可能会向新西兰人提供美国风格的时间戳。

    我喜欢上面评论中发布的技巧,但这听起来像QA头疼,因为你可能正在处理大量以非常不同的方式实现时间戳的客户端。

    我见过的最有效的解决方案是简单地提供一个面板,允许用户选择他们喜欢的时间格式。有些用户甚至像ISO格式一样****喘气。然后你做时间格式转换服务器端。如果您的应用程序语言没有适合时区格式映射的区域设置,请检查您的数据库。许多数据库也提供基于区域设置的自定义时区格式。


    因为这个anwser仍然在google中弹出,我分享现在可以通过使用readonly datetime-local输入(见下文)来做到这一点,然后你可以按照你想要的方式设置输入样式:

    1
    <input type="datetime-local" value="2018-06-12T19:30" readonly />

    有关详细信息,请参阅:https://developer.mozilla.org/en-US/docs/Web/HTML/Element/input/datetime-local