Globalize.js - как анализировать дату и время, а не просто дату

Globalize.js позволяет анализировать строку даты на основе текущей используемой культуры

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

То, что я хотел бы сделать, это проанализировать DateTime. Этот объект 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.m или p.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.

Ответ 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(""), то просто укажите культуру в культуре().

Я только что пробежал по этому сценарию несколько минут назад и нашел это решение, последнее, что это грязно, я надеюсь, что есть более чистый способ сделать это.

Примечание. Это применимо только к устаревшей версии Globalize 0.x.

Примечание 2. Передача жесткого кода НЕ рекомендация i18n.

Ответ 2

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)

Дополнительная информация и примеры.
Дополнительная информация о загрузке CLDR.
Заметки о том, как использовать шаблоны CLDR

Ответ 3

Я бы посмотрел на 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

Если вы не укажете смещение часового пояса, разбор строки приведет к созданию даты в текущем часовом поясе пользователя.

Ответ 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.
            }
        }
    }
});

Это не лучшее решение, изменив его, но для моей и большинства других целей они не будут обновить Globalization.js от версии 0.x до 1.x в ближайшее время.

Этот ответ означает, что вы можете иметь дату со временем и просто поле даты вместе в одном проекте и на той же странице.