簡體   English   中英

Noda Time入門

[英]Getting Started with Noda Time

我希望將Noda時間用於一個相當簡單的應用程序,但是我很難找到任何文檔來處理一個非常基本的用例:

我有一個登錄用戶,並將在設置中存儲他們的首選時區。 來自客戶端的任何日期/時間以已知的文本格式(例如“dd / MM / yyyy HH:mm”),具有已知的時區id(例如“Europe / London”)。 我計划將這些時間轉換為UTC / Noda Instants,以防止需要在數據庫中存儲每個日期的時區信息。

首先,這聽起來像是一種明智的做法嗎? 我可以自由地改變任何東西,所以很樂意設置一個更好/更明智的課程。 數據庫是MongoDb,使用C#驅動程序。

我試過的是沿着這些方向,但努力克服第一步!

var userSubmittedDateTimeString = "2013/05/09 10:45";
var userFormat = "yyyy/MM/dd HH:mm";
var userTimeZone = "Europe/London";

//noda code here to convert to UTC


//Then back again:

我知道有人會問“你有什么嘗試”,我所擁有的是各種失敗的轉換。 很高興被指向“Noda時間入門”頁面!

我計划將這些時間轉換為UTC / Noda Instants,以防止需要將所有時區信息與數據庫中的每個日期一起存儲。

如果您以后不需要知道原始時區,那就沒問題了。 (例如,如果用戶更改時區,但仍希望在原始時區中重復出現某些內容)。

無論如何,我會將其分為三個步驟:

  • 解析為LocalDateTime
  • 將其轉換為ZonedDateTime
  • 將其轉換為Instant

就像是:

// TODO: Are you sure it *will* be in the invariant culture? No funky date
// separators?
// Note that if all users have the same pattern, you can make this a private
// static readonly field somewhere
var pattern = LocalDateTimePattern.CreateWithInvariantCulture("yyyy/MM/dd HH:mm");

var parseResult = pattern.Parse(userSubmittedDateTimeString);
if (!parseResult.Success)
{
    // throw an exception or whatever you want to do
}

var localDateTime = parseResult.Value;

var timeZone = DateTimeZoneProviders.Tzdb[userTimeZone];

// TODO: Consider how you want to handle ambiguous or "skipped" local date/time
// values. For example, you might want InZoneStrictly, or provide your own custom
// handler to InZone.
var zonedDateTime = localDateTime.InZoneLeniently(timeZone);

var instant = zonedDateTime.ToInstant();

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM