2013-07-17 6 views
12

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

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

То, что я хотел бы сделать, это разобрать DateTime. Объект Date Javascript обрабатывает это, я удивлен, что библиотека 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, которая предоставляет такую ​​функциональность? Я огляделся, но не нашел много.

UPDATE ж/принял ответ

Вы можете разобрать дату, если вы знаете формат, что дата находится.

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.

+0

Передача жесткого кода не является рекомендацией i18n. Вместо этого вы должны использовать скелет (Globalize 1.x) http://stackoverflow.com/a/30237866/798133. –

ответ

11

Если вы знаете, шаблон, который вы используете:

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.

+0

Я просто хотел проанализировать время, поэтому я использовал Globalize.parseDate («11:55 pm», Globalize.culture(). Calendar.patterns.t). Но в результате я получил нуль. Любой совет? –

+0

@MARKANDBhatt просто добавляет действительную строку даты в вашу строку времени и вызывается Globalize.parseDate –

+1

Я думаю, что это решение применимо к '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 

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

+2

Я нахожу момент.js очень полезным, когда дело доходит до обработки даты/времени. Однако в сценариях я занимаюсь большей частью времени, когда культура определяется либо пользователем, либо браузером, поэтому я не знаю правильного шаблона перед рукой. Обычно я получаю что-то вроде: момент ("16/07/2012 12:45", moment(). Lang() ._ longDateFormat.L + "" + moment(). Lang() ._ longDateFormat.LT) .toDate() , который похож на мой ответ ниже, используя глобализацию. Вы знаете, есть ли более короткий путь? –

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

+0

вы устанавливаете другой разделитель, а не запятую? yMdHm принудительно вводит запятую (,) в качестве разделителя, тогда как мне нужно пространство. – Jimit

+0

Глобализация не снисходительна в этом отношении, то есть игнорировать литерал или принимать любой литерал. (Примечание: запятая и пробел - это буква, определяемая форматом). Одним из хакерских решений было бы изменение данных CLDR до того, как вы его подадите на Globalize. В качестве альтернативы, вы можете использовать управляемый ввод, например https://github.com/rxaviers/react-date-input? –

1

Принятый ответ означает, что все поля времени даты должны иметь полную дату и время. Однако более чем допустимо, что некоторые поля будут иметь только дату. Поэтому я изменил файл 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 в ближайшее время.

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

Смежные вопросы