2016-04-04 10 views
1

Ich benutze moment.js + Zeitzone um mit Datums- und Zeitobjekten zu arbeiten und mit globalisieren um Zahlen, Währungen usw. dem Benutzer anzuzeigen.Formatieren Sie eine moment.js + Zeitzone mit jquery globalisieren

Nun möchte ich ein moment.js Date mit globalisieren, also war mein erster Ansatz, einfach die to getDate() - Funktion von moment.js zu verwenden, die leider die Zeitzoneninformation verwirft (Bsp. 1). Wenn ich ein neues Date() mit den in die richtige Zeitzone konvertierten Datumswerten initialisiere, bekomme ich das korrekte Ergebnis (Beispiel 2), aber wenn ich die Vollversion benutze, zeigt es die Zeitzone UTC an (was offensichtlich nicht korrekt ist). Gibt es eine Möglichkeit, diese Komponenten zusammenzuarbeiten?

var m = moment.tz(1459779436, 'Europe/Berlin'); 
// Ex 1: Date is printed in UTC, so with an offset of 2 hours 
globalize.formatDate(m.getDate(), {datetime: 'full'}); 
globalize.formatDate(new Date(m.toISOString()), {datetime: 'full'}); 
// Ex 2: Correct times are printed, but with wrong timezone 
globalize.formatDate(new Date(m.year(), m.month(), m.date(), m.hour(), m.minute(), m.seconds(), m.milliseconds()), {datetime: 'full'}); 

Antwort

0

Globalize wird IANA timezones auf der kommenden Version 1.3 unterstützen!

npm install [email protected] cldr-data iana-tz-data 

Dann

var Globalize = require("globalize"); 
Globalize.load(require("cldr-data").entireSupplemental()); 
Globalize.load(require("cldr-data").entireMainFor("en")); 
Globalize.loadIANATimezone(require("iana-tz-data")); 

Globalize("en").formatDate(new Date(), {datetime: "short", timeZone: "America/Los_Angeles"}); 
// > '3/19/17, 3:19 PM' 
Globalize("en").formatDate(new Date(), {datetime: "short", timeZone: "America/New_York"}); 
// > '3/19/17, 6:19 PM' 
Globalize("en").formatDate(new Date(), {datetime: "short", timeZone: "America/Sao_Paulo"}); 
// > '3/19/17, 7:19 PM' 
Globalize("en").formatDate(new Date(), {datetime: "short", timeZone: "Europe/Berlin"}); 
// > '3/19/17, 11:19 PM' 

Globalize("en").formatDate(new Date(), {datetime: "full", timeZone: "America/Los_Angeles"}); 
// > 'Sunday, March 19, 2017 at 3:19:22 PM Pacific Daylight Time' 
Globalize("en").formatDate(new Date(), {datetime: "full", timeZone: "America/New_York"}); 
// > 'Sunday, March 19, 2017 at 6:19:22 PM Eastern Daylight Time' 
Globalize("en").formatDate(new Date(), {datetime: "full", timeZone: "America/Sao_Paulo"}); 
// > 'Sunday, March 19, 2017 at 7:19:22 PM Brasilia Standard Time' 
Globalize("en").formatDate(new Date(), {datetime: "full", timeZone: "Europe/Berlin"}); 
// > 'Sunday, March 19, 2017 at 11:19:53 PM Central European Standard Time' 

PS: Beachten Sie unterstützt auch Datumszeichenketten in bestimmten IANA Zeitzonen Parsen.

Einzelheiten hier https://github.com/globalizejs/globalize/pull/701#issuecomment-287652673


Alte Antwort:

Können Sie moment.js für Datum Manipulation verwenden und Globalize verwenden das Datum für die Formatierung ohne die Zeitzone Teil, dh Ihr zweites Beispiel mit {datetime: "medium"} [ 1]. Ist das für Sie machbar? Alternativ könnten Sie das verwenden plus moment.js, um den Namen der Zeitzone für Sie zu drucken?

1: Wenn Sie ein anderes/benutzerdefiniertes Muster benötigen, können Sie {skeleton: <pattern>} verwenden.

Die richtige Antwort

Zeitzone Unterstützung globalisieren beschränkt sich auf das, was durch das native JavaScript Date angeboten wird, dessen Zeitzone Unterstützung beschränkt sich auf die Benutzer der lokalen Zeitzone Offset bekommen und das ist alles, das heißt, es ist nicht der Einstellung Datum mit einem anderen Zeitzonennamen oder Zeitzonenoffset. Daher kann nur die lokale Zeitzone des Benutzers formatiert werden (keine willkürliche). Daher glaube ich, dass Globalize Ihnen beim Formatieren von Datum und Uhrzeit nützlich sein wird, aber nicht für den Zeitzonenbereich. Wenn Sie mehr über die Zeitzonenunterstützung von Globalize erfahren möchten, finden Sie Details unter https://github.com/jquery/globalize/pull/202#issuecomment-33020199.

Verwenden von Globalize, um das Datum zu formatieren, gibt Ihnen eine CLDR-konforme Formatierung (und aktuelle Länderdaten) und es wird Laufzeitunterstützung: kleine endgültige Dateigröße (für schnelleres Laden der Seite) und vorkompilierte Formatierung (für schnellere Ausführung auf dem Client) (more info). Ich hoffe, dass dies eine Hilfe sein könnte, lassen Sie es mich wissen, wenn Sie weitere Fragen haben.

+0

OK, vielen Dank für die Erklärung, die meisten was ich herausgefunden habe.Ich verwende beide Komponenten in einer Knoten-Anwendung, um Kunden zu ermöglichen, ihre Daten (in seltsamen Zeitzonen) mit auswählbaren Vorlagen zu formatieren, also mochte ich die Möglichkeit, die date/time/datetime + short/meidum/long/volle Vorlagen zu verwenden Globalisierung, aber ich muss eine andere Lösung verwenden, denke ich. Danke trotzdem! –

0

Ich benutzte jetzt einen wirklich hacky Ansatz und ersetzte einfach den getTimezoneOffset eines neuen Datums durch eine Funktion, die den Wert zurückgibt, der durch die momentane Zeitzone generiert wurde.

function momentToDate(input) { // Do NOT use the result to anything else than passing it into globalize 
    var res = new Date(input.year(), input.month(), input.date(), input.hour(), input.minute(), input.seconds(), input.milliseconds()); 
    var offset = input.utcOffset(); 
    res.getTimezoneOffset = function() { 
     return offset; 
    } 
    return res; 
} 

So globize wird das richtige Datum und die richtige Zeitzone Offset drucken.