2015-11-01 16 views
5

Ich bin neu bei NodaTime und möchte es in meiner Anwendung implementieren.Wie analysiere ich Datumszeichenfolge zu einem NodaTime-Objekt?

Wie kann ich Datum Zeichenfolge NodaTime Objekt analysieren?

Hier ist, was ich derzeit habe:

var dateInput = "06/11/2015"; 
var pattern = InstantPattern.CreateWithInvariantCulture("dd/MM/yyyy"); 
var parseResult = pattern.Parse(dateInput); 
var localDate = parseResult.Value; 
DateTimeZone tzNZ = DateTimeZoneProviders.Tzdb["Asia/Hong_Kong"]; 
ZonedDateTime result = localDate.InZone(tzNZ); 

meine LOCALDATE Variable jetzt 2015-11-06T00:00:00Z ist (und auf dem, was ich in der ISO-Format zu lesen, Z in letzten Teil, darauf hingewiesen, dass es UTC ist)

mein Ergebnis Variable ist jetzt 2015-11-06T13:00:00 NZ (+13)

Aber ich bin nicht sicher, ob ich in dem richtigen Weg bin.

Hier ist, was ich wirklich will.

  1. umrechnen dateInput (Datum string) zu einem NodaTime Objekt mit dem folgenden Format dd/MM/yyyy
  2. Und dann haben sie als UTC dann in einen Typ long Daten konvertieren dann in die Datenbank speichern
  3. dann versuchen, rufen Sie die gespeicherten Daten ab und verwenden Sie dann eine bestimmte Zeitzone. Sagen Sie Asia/Hong_Kong

Ist es möglich?

EDIT

var dateInput = "06/11/2015"; 
var pattern = LocalDatePattern.CreateWithInvariantCulture("dd/MM/yyyy"); 
LocalDate parseResult = pattern.Parse(dateInput).Value; 
DateTimeZone tzHK = DateTimeZoneProviders.Tzdb["Asia/Hong_Kong"]; 
LocalTime time = GetTimeOfDay(); 
LocalDateTime localDateTime = parseResult + time; 

// change it to UTC then convert it to 
// long data type then save it to the database 

// methods 
private LocalTime GetTimeOfDay() 
{ 
    var instant = SystemClock.Instance.Now; 
    var tz = DateTimeZoneProviders.Tzdb["Asia/Hong_Kong"]; 

    return instant.InZone(tz).TimeOfDay; 
} 

Ich habe diesen Schnipsel und dieses Szenario, in dem der Benutzer kann nur Eingang date06/11/2015 sagt dann auf in die Datenbank zu speichern, ich brauche es aktuelle Zeit (aktuelle Zeit des Benutzers) für Betrachtungszwecke. Der Grund, warum ich es in long umwandeln ist, weil ich Entity Framework verwende.

Ist das ratsam?

+0

Frage zu Ihrer Bearbeitung - Warum sollten Sie in diesem Szenario überhaupt ein Datum eingeben? Das klingt, als würden Sie die Reihenfolge mit dem aktuellen Datum und der aktuellen Uhrzeit stempeln. –

+0

@MattJohnson Dies ist nur eine Idee, die ich kam. und mir ist klar, dass es keinen Sinn ergibt. Ich denke, ich muss es löschen. –

+0

Ja, wenn du nur Timestamping verwendest, dann trifft das alles nicht zu, da du einfach 'SystemClock.Instance.Now' verwenden würdest, um das aktuelle UTC-basierte' Instant' zu erhalten. Oder benutze einfach 'DateTime.UtcNow' oder eine ähnliche Funktion in Deiner Datenbank und dann brauchst du Noda Time überhaupt nicht. –

Antwort

5

Ich werde aus einer etwas anderen Perspektive beantworten. Sie haben angegeben, dass Sie zu long konvertiert haben, weil Sie Entity Framework verwendet haben. Das ist wahrscheinlich nicht notwendig.

Es klingt wie Sie einfach auf das Kalenderdatum Round-Trip versucht werden. Wenn keine bestimmte Zeit involviert ist (z. B. Mitternacht oder Tagesbeginn) und Sie möchten, dass alle Benutzer denselben Jahresmonat und -tag sehen, unabhängig davon, in welcher Zeitzone sie sich befinden, wäre es besser (IMHO) behalte die Dinge während des gesamten Prozesses in diesem Sinne.

Einige dagegen argumentieren würde, mit gemeinsamen best practice „immer in UTC speichern“ zu sein, aber, dass die Beratung nicht gilt in zwei allgemeine Szenarien bis:

  1. „Ich habe eine lokale bekam Datum und Uhrzeit, aber sie sind in der Zukunft und ich verwende sie für die Planung. "

  2. "Ich arbeite gerade mit einem Kalenderdatum ohne jede Tageszeit, es kann Vergangenheit oder Zukunft sein, aber es ist ein menschliches zentrisches Datum, anstatt ein einzigartiger Zeitpunkt."

Sie erscheinen im zweiten Fall sein, also:.

  • Verwenden Sie eine Datum-only Art in Ihrer Datenbank, wie der DATE Typ in SQL Server, PostgreSQL, MySQL, Oracle, und die meisten anderen relationalen Datenbanken.

  • eine LocalDate Art in Noda Zeit. versuchen sie nicht, es zu Instant zu konvertieren, LocalDateTime, ZonedDateTime oder long.

  • Verwenden Sie einen DateTime-Typ (mit .Kind == DateTimeKind.Unspecified) als Vermittler zwischen der Datenbank und Ihre LocalDate Eigenschaft zu handeln. Dies wird üblicherweise mit dem "buddy properties" -Muster gemacht, wie es in this answer zu sehen ist.

+0

Hinweis, ich mache mehrere Annahmen in meiner Antwort. Wenn du nicht gerade versuchst, ein Kalenderdatum zu runden, dann lass es mich wissen und ich werde meine Antwort löschen oder überarbeiten. Vielen Dank. –

+0

Oh, also könnte ich etwas wie Ihren Ansatz verwenden, um 'DATE' zu verwenden und' DATE' nur in der Datenbank zu speichern und sich keine Gedanken über die Regel "immer speichern in UTC" zu machen? Ich dachte immer und basierend auf was ich lese, dass du immer in UTC speichern solltest. Ich hätte nie gedacht, dass es eine Ausnahme gibt. Ich bin mir nicht wirklich sicher, was ein Kalenderdatum ist. –

+0

Ja, das meine ich. "Round-Trip" ist die Idee, dass Sie genau den Wert erhalten, den Sie gespeichert oder übertragen haben. Es beginnt als die Zeichenfolge "2015-11-01", wird in der Datenbank als "2015-11-01" gespeichert und kann mit demselben Wert aus der Datenbank geladen werden. (Etwas, das nicht umläuft, wäre wie 'DateTimeKind.Utc' zu setzen, was nicht in der Datenbank gespeichert wird, so wäre' DateTimeKind.Unspecified' bei Rückgabe.) –

Verwandte Themen