如何根据浏览器文化格式化 JavaScript 日期?

Posted

技术标签:

【中文标题】如何根据浏览器文化格式化 JavaScript 日期?【英文标题】:How format JavaScript Date with regard to the browser culture? 【发布时间】:2011-12-12 02:53:01 【问题描述】:

我需要格式化 javascript Date 对象。它应该根据浏览器使用的文化以短格式显示日期和时间,例如:

20/10/2011 10:20 PM
10.20.2011 22:20

我该怎么做(最好使用 jQuery)?

【问题讨论】:

最好使用 jQuery?为什么这样更可取? 另外,我认为您正在寻找toLocale methods。 有一个 jquery 插件。但它依赖于 jquery 基本算术插件。 @JaredFarrish - Date.prototype.toLocaleString() 跨浏览器不一致,不能用于根据本地系统设置可靠地显示日期。 @chris 那么插件的名称是什么?能举个例子吗? 【参考方案1】:

Date() 对象将为您获取客户端时间 (live demo here):

var now=new Date();
alert(now.toLocaleString());

JS 和 jQuery 没有内置的格式化函数。要对其进行不同的格式化,请使用 format() (1.2kb) here 之类的函数,然后以下代码将生成类似 "10/10/2012 8:50pm" 的格式:

var now=new Date();    
alert( now.format("mm/dd/yy h:MM:ss TT") );

【讨论】:

P.S.您总是可以使用服务器端语言(例如 php)将时间回显或打印到 JS 中,因为这些语言通常具有更强大的时间格式化选项 上面哪里有对 OP 的回答?格式化日期非常简单,真的不需要图书馆来做。在可靠的跨浏览器功能中以与系统设置一致的格式显示日期是不可能的。 据我所知,根据浏览器文化,这些都不能输出“20/10/2011”或“10.20.2011”。 @user695797 - 使用我引用的函数(请访问链接),您可以创建任何您想要的格式,包括您要求的格式:format("mm/dd/yy h:MM:ss TT ") 可以解决问题(答案已更新)。【参考方案2】:

浏览器要么使用系统设置来设置日期格式,要么使用自己的(通常以美国为中心)设置。

有一个 Date.prototype.toLocaleDateString() 方法应该根据当前系统设置返回一个日期,但是由于浏览器之间的不一致,它依赖于实现并且完全不可靠。

例如2011 年 12 月 13 日对我来说:

    Safari 返回13 December 2001 火狐12/13/2011 歌剧Tuesday December 13, 2011Tuesday, December 13, 2011 IE 6 Tuesday, 13 December, 2011

所以只有 Safari 和 IE 才真正使用系统设置,看来其他浏览器的开发者要么懒惰,要么冷漠,要么无知,无法适应非美国用户。

另一种方法是询问用户他们喜欢哪种格式,或者只使用明确的格式,例如每个人都会理解 2011 年 12 月 13 日。如果您真的必须只使用数字,那么 ISO-8601 格式应该可以正常工作:2011-12-13 并具有易于排序的额外好处。

一些以上述格式打印短日期的函数:

// format: 2011/12/5
function shortDate1(obj) 
  obj = obj || new Date();
  return obj.getFullYear() + '/' + (obj.getMonth() + 1) + '/' + obj.getDate();



// format: 2011/12/05 
// (padded single digit month and day)
function shortDate2(obj) 

  function z(n) 
    return (n < 10? '0' : '') + n;
  

  obj = obj || new Date();
  return obj.getFullYear() + '/' + z(obj.getMonth() + 1) + '/' + z(obj.getDate());



// format: 15-Dec-2011
function shortDate3(obj) 

  obj = obj || new Date();

  function z(n) 
    return (n < 10? '0' : '') + n;
  

  months = ['Jan','Feb','Mar','Apr','May','Jun',
            'Jul','Aug','Sep','Oct','Nov','Dec'];

  return [z(obj.getDate()),months[obj.getMonth()],obj.getFullYear()].join('-');

【讨论】:

Safari 返回 2001 年?而不是 2011 年? 我认为浏览器的差异仅适用于没有为toLocaleDateString 明确设置语言环境和/或其他选项时?!不应该输出例如。 str.toLocaleDateString('en-US', year: 'numeric', month: 'long', day: 'numeric' ) 跨浏览器保持一致?! "ISO-8601 格式应该没问题:2011/12/13" - 这不是 ISO 8601 中指定的格式。ISO 8601 中的有效格式是“20111213”(基本格式,数字仅)或“2011-12-13”(扩展格式,必须是破折号)。 @SlyGryphon——谢谢。这个答案来自很久以前...... ;-)【参考方案3】:

知道系统在其字符串方法中是使用日-月还是月-日很方便,主要用于设置用户输入的顺序。 toLocaleString 非常适合显示一个已知的日期——而且它是国际性的。

    Date.dmOrder=(function()
      return Date.parse('2/6/2009')> Date.parse('6/2/2009');
    )()

if(Date.dmOrder)// ask for the date first
else // ask for the month first

【讨论】:

toLocaleString 不好,也不国际化。在大多数浏览器(Chrome、Firefox、IE、Opera 至少)中,它非常以美国为中心。 我如何获得分隔符格式?一些文化使用“/”和一些“.”,我希望还有其他文化特定的分隔符。

以上是关于如何根据浏览器文化格式化 JavaScript 日期?的主要内容,如果未能解决你的问题,请参考以下文章

JavaScript:使用 .NET String.Format() 之类的文化格式化数字/货币?

根据文化显示正确的日期格式

根据文化代码在Python中格式化数字

Javascript中的文化特定日期时间

如何修改 Blazor(服务器)中的当前文化日期格式?

VB.NET 根据所选文化格式化数字