Globalize.js - 如何解析日期和时间而不仅仅是日期

Posted

技术标签:

【中文标题】Globalize.js - 如何解析日期和时间而不仅仅是日期【英文标题】:Globalize.js - how to parse date and time rather than just date 【发布时间】:2013-07-17 22:50:58 【问题描述】:

Globalize.js 允许您根据应用的当前文化解析日期字符串

var date = Globalize.parseDate("17/07/2013"); //Wed Jul 17 00:00:00 PDT 2013

我想做的是解析一个日期时间。 javascript Date 对象处理这个,我很惊讶Globalize.js 库没有。

var date = new Date("07/17/2013 11:55 pm"); //Wed Jul 17 23:55:00 PDT 2013
var date = Globalize.parseDate("07/17/2013 11:55 pm"); //null

我错过了什么吗?我倾向于自己解析时间部分。是否有另一个扩展 Globalize.js 的库来提供这种功能?我环顾四周,但没有找到太多。

已接受答案的更新

如果您知道日期的格式,则可以解析日期。

    var date = Globalize.parseDate("17/07/2013 11:55 pm", "MM/dd/yyyy hh:mm tt"); 
    //date = null

在我的示例中,日期将为空,因为它预计时间段的格式为 a.mp.m.。更改后,我就可以解析日期时间了。

   var date = Globalize.parseDate("17/07/2013 11:55 p.m.", "MM/dd/yyyy hh:mm tt"); 
   //date = Wed Jul 17 23:55:00 PDT 2013

注意:这仅适用于已弃用 Globalize 0.x。

注意 2:传递硬编码模式不是 i18n 建议。

【问题讨论】:

传递硬编码模式不是 i18n 的建议。您应该改用骨架(全球化 1.x)***.com/a/30237866/798133。 【参考方案1】:

如果你知道你正在使用的模式:

var date = Globalize.parseDate("07/17/2013 11:55 pm", "MM/dd/yyyy hh:mm tt");

如果你不知道模式:

var date = Globalize.parseDate("07/17/2013 11:55 pm", Globalize.culture().calendar.patterns.d + " " + Globalize.culture().calendar.patterns.t)

以上行假设当前文化,如果您需要其他文化,或者如果您没有通过调用 Globalize.culture("") 建立本地文化,那么只需在culture() 上指定文化。

几分钟前我刚刚在这个场景下运行,找到了这个解决方案,最新的它很乱,我希望有一个更清洁的方法来做到这一点。

注意:这仅适用于已弃用的 Globalize 0.x。

注意 2:传递硬编码模式不是 i18n 建议。

【讨论】:

我只是想解析时间,所以我使用了 Globalize.parseDate("11:55 pm", Globalize.culture().calendar.patterns.t)。但结果我得到了空值。有什么建议吗? @MARKANDBhatt 只需在您的时间字符串前面加上一个有效的日期字符串并调用 Globalize.parseDate 我认为这个解决方案适用于globalize 0.x 版本,但不适用于1.x 版本的库【参考方案2】:

我会研究 moment.js,你可以用它来做

d = moment("17/07/2013 11:55 pm" , "DD/MM/YYYY HH:mm a"); // parsed as 11:55pm local time
d = d.toDate(); //get it as a native js date object

除非您指定时区偏移量,否则解析字符串将在当前用户时区创建日期。

【讨论】:

我发现 moment.js 在日期/时间操作方面非常有用。然而,在我处理的大多数情况下,文化是由用户或浏览器定义的,所以我事先不知道正确的模式。我通常会得到类似的结果: moment("16/07/2012 12:45", moment().lang()._longDateFormat.L + " " + moment().lang()._longDateFormat.LT).toDate () 这类似于我在下面使用 Globalize 的答案。不知道有没有更短的路?【参考方案3】:

Globalize 1.x 基于 CLDR,现在有不同的 API。按照新代码完成您需要的操作:

Globalize("en").parseDate("5/14/2015, 9:47 AM", skeleton: "yMdhm");
// > Thu May 14 2015 09:47:00 GMT-0300 (BRT)

More information and examples。 More information on how to load CLDR. Notes on how to use CLDR patterns

【讨论】:

如何设置不同的分隔符而不是逗号? yMdHm 强制使用逗号 (,) 作为分隔符,而我需要空格。 Globalize 在这方面并不宽容,即忽略文字或接受任何文字。 (注意逗号和空格是由格式定义的文字)。一种巧妙的解决方案是在将 CLDR 数据输入 Globalize 之前对其进行修改。或者,您可以使用github.com/rxaviers/react-date-input 之类的引导式输入吗? 我正在尝试使用骨架的这种方法,但它不解析: Globalize("nb").parseDate("05.09.2018 12:00",skeleton: "yMdHm") // 根据 ca-gregorian.json,yMd 是 dMy,Hm 是 HH:mm【参考方案4】:

接受的答案意味着所有日期时间字段都必须包含完整的日期和时间。但是,有些字段只有一个日期是完全可以接受的。所以我修改了 globalize.culture.en-AU.js 来添加我的自定义模式。

Globalize.addCultureInfo( "en-AU", "default", 
    name: "en-AU",
    englishName: "English (Australia)",
    nativeName: "English (Australia)",
    numberFormat: 
        currency: 
            pattern: ["-$n","$n"]
        
    ,
    calendars: 
        standard: 
            firstDay: 1,
            patterns: 
                d: "d/MM/yyyy",
                D: "dddd, d MMMM yyyy",
                f: "dddd, d MMMM yyyy h:mm tt",
                F: "dddd, d MMMM yyyy h:mm:ss tt",
                M: "dd MMMM",
                Y: "MMMM yyyy",
                Z: "dd/MM/yyyy hh:mm:ss tt" // This is a custom one for our specifications.
            
        
    
);

修改它不是最好的解决方案,但出于我和大多数其他人的目的,它们不会很快成为upgrading the Globalization.js from version 0.x to 1.x。

这个答案意味着您可以在同一个项目和同一页面上拥有一个带时间的日期,并且只是一个日期字段。

【讨论】:

以上是关于Globalize.js - 如何解析日期和时间而不仅仅是日期的主要内容,如果未能解决你的问题,请参考以下文章

Ruby 中的日期时间解析

如何使用 Joda Time 解析包含时区的日期

如何在 iOS 上将“MongoDB 日期时间(ISO 日期)”解析为 NSDate(swift 和 Objective-c)

将时间戳数据解析为本地日期和时间的问题

如何将xml日期和时间解析并转换为秒

我可以禁用 openpyxl 自动将字符串解析为日期时间吗?