2013-07-17 12 views
12

Globalize.js consente di analizzare una stringa data in base alla cultura corrente applicataGlobalize.js - come analizzare data e l'ora non solo risalgono

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

Quello che vorrei fare è analizzare un DateTime. L'oggetto javascript Date gestisce questo, mi sorprende che la libreria Globalize.js non lo faccia.

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 

Mi manca qualcosa? Sono propenso a analizzare personalmente la parte del tempo. Esiste un'altra libreria che estende Globalize.js che fornisce questo tipo di funzionalità? Mi sono guardato intorno ma non ho trovato molto.

UPDATE w/risposta

accettato È possibile analizzare la data, se si conosce il formato che la data è in.

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

Nel mio esempio la data sarà nulla perché si aspetta che il periodo di tempo sia nel formato a.m o p.m.. Una volta cambiato, sono stato in grado di analizzare un datetime.

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 

Nota: Questo è applicabile solo al deprecato globalizzare 0.x.

Nota 2: Passare un modello hardcoded è NON una raccomandazione di i18n.

+0

Il passaggio di un pattern hardcoded NON è un consiglio i18n. Dovresti invece utilizzare skeleton (Globalize 1.x) http://stackoverflow.com/a/30237866/798133. –

risposta

11

Se si conosce il modello che si sta utilizzando:

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

Se non si conosce il modello:

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

La linea di cui sopra sta assumendo la cultura corrente, se ne avete bisogno per altri cultura o se non hai stabilito la cultura locale chiamando Globalize.culture (""), quindi specifica la cultura su culture().

Ho appena eseguito questo scenario pochi minuti fa, e ho trovato questa soluzione, l'ultima è disordinata, spero che ci sia un modo più pulito per farlo.

Nota: applicabile solo a Globalize obsoleto 0.x.

Nota 2: Passare un modello hardcoded è NON una raccomandazione di i18n.

+0

Volevo solo analizzare il tempo, quindi ho usato Globalize.parseDate ("11:55 pm", Globalize.culture(). Calendar.patterns.t). Ma ho ottenuto nulla come risultato. Qualche consiglio? –

+0

@MARKANDBhatt semplicemente anteporre una stringa di data valida alla stringa del tempo e chiama Globalize.parseDate –

+1

Penso che questa soluzione sarebbe applicabile sulla versione 'globalize' 0.x, ma non per la versione 1.x della libreria –

2

Vorrei guardare in moment.js, con essa si può fare

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 

A meno che non si specifica un offset di fuso orario, il parsing di una stringa creerà una data nel fuso orario utenti corrente.

+2

Trovo moment.js molto utile quando si tratta di manipolazione data/ora. Tuttavia negli scenari mi occupo della maggior parte delle volte che la cultura è definita dall'utente o dal browser, quindi non conosco il modello giusto in anticipo. Di solito finisco con qualcosa tipo: momento ("16/07/2012 12:45", momento(). Lang() ._ longDateFormat.L + "" + momento(). Lang() ._ longDateFormat.LT) .toDate() che è simile alla mia risposta sotto usando Globalize. Sai se c'è un modo più breve? –

3

Globalize 1.x è basato su CLDR e ora ha un'API differente.Seguire il nuovo codice per compiere quello che vi serve:

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

Come sarebbe hai impostato un separatore diverso anziché una virgola? yMdHm applica virgola (,) come separatore mentre ho bisogno di spazio. – Jimit

+0

La globalizzazione non è indulgente a questo proposito, ad esempio, per ignorare un letterale o per accettare qualsiasi letterale. (Nota la virgola e lo spazio è un letterale definito dal formato). Una soluzione hacky sarebbe quella di modificare i dati CLDR prima di alimentarli su Globalize. In alternativa, puoi utilizzare un input guidato come https://github.com/rxaviers/react-date-input? –

1

La risposta accettata significa che tutti i campi di data e ora devono avere una data e un'ora complete. Tuttavia, è più che accettabile che alcuni campi abbiano solo una data. Così ho modificato il file globalize.culture.en-AU.js per aggiungere il mio modello personalizzato.

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. 
      } 
     } 
    } 
}); 

non è la soluzione migliore per modificarlo, ma per la mia e la maggior parte degli altri scopi che non sarà upgrading the Globalization.js from version 0.x to 1.x in qualunque momento presto.

Questa risposta indica che è possibile avere una data con l'ora e solo un campo di data insieme nello stesso progetto e nella stessa pagina.

Problemi correlati