2015-11-01 32 views
5

我是NodaTime的新手,我想在我的應用程序中實現它。如何解析日期字符串到NodaTime對象?

如何解析日期字符串到NodaTime對象?

這是我目前擁有:現在

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

我LOCALDATE的變量是2015-11-06T00:00:00Z(基於我在ISO格式讀取,具有Z在最後部分指出,這是UTC)

我的結果變量現在是2015-11-06T13:00:00 NZ (+13)

但我不確定我是否在正確的道路上。

這是我真正想要的。

  1. 轉換的dateInput(日期字符串)的NodaTime對象以下格式dd/MM/yyyy
  2. 然後把它作爲UTC然後轉換爲long數據類型,然後將其保存到數據庫中
  3. 然後嘗試檢索保存的數據,然後使用特定的時區。說Asia/Hong_Kong

這可能嗎?

編輯

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

我有這樣的片段,並這種情況下,用戶可以只輸入date06/11/2015然後在它保存到數據庫中,我需要它的當前時間(用戶的當前時間)用於查看目的。我將其轉換爲long的原因是因爲我正在使用實體框架。

這是可取的嗎?

+0

編輯問題 - 爲什麼你會讓他們在這種情況下輸入日期?這聽起來像是用當前的日期和時間對訂單進行時間戳。 –

+0

@MattJohnson這只是一個想法,我想出了。我只是意識到它沒有任何意義。我想我需要刪除它。 –

+0

是的,如果你只是時間戳,那麼其餘的都不適用,因爲你只是使用'SystemClock.Instance.Now'來獲取當前基於UTC的'Instant'。或者在數據庫中使用'DateTime.UtcNow'或類似的函數,然後根本就不需要Noda Time。 –

回答

5

我會從略有不同的角度回答。你說你正在轉換爲long,因爲你在使用實體框架。這可能沒有必要。

這聽起來像你只是想往返日曆日期。如果沒有特定的時間(比如午夜或者開始),並且你希望所有的用戶不管他們在哪個時區看到同一年的每一天,那麼它會更好(恕我直言)在整個過程中保持這些條款。

有人會反對這一點,與普通的最佳實踐是「總是UTC存儲」,但這個建議並沒有在兩種常見情況托起:

  1. 「我有個地方日期和時間,但他們在未來,我將它們用於計劃目的。「 「我只是在沒有任何時間的日曆上工作,它可能已經過去了現在或將來,但它是一個以人爲中心的民事日期,而不是一個獨特的瞬間。「

你似乎是在第二種情況下這樣:

  • 使用日期,只輸入您的數據庫,如SQL服務器,PostgreSQL的可用DATE類型, MySQL和甲骨文,和其他大多數關係型數據庫。

  • 使用在Noda時間LocalDate類型。不要試圖將其轉換爲InstantLocalDateTimeZonedDateTimelong

  • 使用DateTime類型(與.Kind == DateTimeKind.Unspecified)充當數據庫和LocalDate屬性之間的中介。這通常通過「好友屬性」模式來完成,如in this answer所示。

+0

請注意,我在回答中提出了幾個假設。如果你實際上不只是試圖繞過日曆日期,那麼請告訴我,我會刪除或修改我的回覆。謝謝。 –

+0

哦,所以我可以使用類似你的方法來使用'DATE'並將'DATE'只存儲在數據庫中,而不用擔心「總是以UTC存儲」的規則?我一直認爲,根據我閱讀的內容,應該始終以UTC存儲。我從來沒有想過有一個例外。我不確定'日曆日期'是什麼。 –

+0

是的,這就是我的意思。 「往返」是您獲得您保存或傳輸的確切數值的想法。它以字符串「2015-11-01」開始,以「2015-11-01」的形式保存到數據庫,並且可以使用相同的值從數據庫加載。 (不會往返的東西就像是設置'DateTimeKind.Utc',它不會保存到數據庫中,所以在返回時將會是'DateTimeKind.Unspecified'。) –