2014-03-13 70 views
3

我目前正在使用NodaTime,基於我在C#的DateTime類中處理時區的挫折感。到目前爲止,我真的很高興。將NodaTime轉換爲Unix時間戳和LocalDateTime的重要性

public static string nodaTimeTest(string input) 
{ 
    var defaultValue = new OffsetDateTime(new LocalDateTime(2000, 1, 1, 0, 0), Offset.Zero); 
    var pattern = OffsetDateTimePattern.Create("yyyy-MM-dd'T'HH:mm:sso<m>", CultureInfo.InvariantCulture, defaultValue); 
    var result = pattern.Parse(input).Value; 

    return result.ToString(); 
} 

我有三個具體問題。以上是我用dateTime字符串解析的方法。我有一個format字符串,它允許我如何解析輸入。我的問題是:


難道我的LocalDateTime(..)是什麼?我使用的方法是Matt Johnson的Stack example,他的日期爲2000, 1, 1, 0, 0。我覺得很奇怪,因爲大多數日期類我知道用大紀元1970, 1, 1, 0 ,0,所以我改變了我的方法遏制大紀元日期,但輸出是相同的:

enter image description here


怎麼辦我將時間轉換爲Unix時間戳?它沒有出現這樣做的內置方法。


使用這種方法:

public static string nodaTimeTest6(string input, int timeZone) 
    { 
     // var defaultValue = new OffsetDateTime(new LocalDateTime(2000, 1, 1, 0, 0), Offset.Zero); 
     var defaultValue = new OffsetDateTime(new LocalDateTime(2000, 1, 1, 0, 0), Offset.FromHours(timeZone)); 
     var pattern = OffsetDateTimePattern.Create("yyyy-MM-dd'T'HH:mm:sso<m>", CultureInfo.InvariantCulture, defaultValue); 
     var result = pattern.Parse(input); 

     return result.Value.ToString(); 
    } 

我測試了NodaTime的能力,用這種方法 - 具體而言,我在想,如果我可以在抵消了定義的日期/時間解析裏面,並在同一時間,我的timeZone輸入還允許輸入時區/偏移量。有趣的是,我的輸入timeZone被忽略,所以抵消了我的nodaTimeTest6輸出是輸入日期字符串:

enter image description here

這是期望行爲?

+1

喬恩Skeet傳入... – Kittoes0124

+0

'NodaTime'標記是StackOverflow的喬恩信號。通過喬恩的方式的偉大的工具..我得到代碼和運行,而不必手動找出哪個重載/方法/類使用。我特別喜歡時間和日期屬性的表現方式。例如,我可以抓住'something.Offset',它會顯示時區偏移量。喜歡它.. – theGreenCabbage

回答

7

這與我的LocalDateTime(..)有什麼關係嗎?

  • OffsetDateTimePattern.Create方法需要一個默認值。僅在解析失敗時才使用,並且在使用result.Value之前未檢查result.Success

  • 其他模式的過載不需要默認值(請參閱issue #267)。我選擇了特定的默認值2000-01-01T00:00:00.0000000+00:00,因爲它與顯式指定默認值時的the other patterns use類似。

  • 雖然沒有任何意義。你可以使用你想要的任何默認值。

如何將時間轉換爲Unix時間戳?它沒有出現這樣做的內置方法。

  • result.ValueOffsetDateTime。該Instant類型使用Unix的時代,所以你可以這樣做:

    int unixTime = result.Value.ToInstant().Ticks/NodaConstants.TicksPerSecond; 
    
  • 需要注意的是Unix的時間戳精確到秒。如果你傳遞給JavaScript,你會想要使用TicksPerMillisecond並返回long

...我在想,如果我能在一個日期/時間內定義的抵消了解析,並在同一時間,我timeZone輸入還允許時區/偏移的輸入。

  • 對不起,但我不完全理解你問這裏。你能澄清一下嗎?

  • 從您提供的代碼看來,您將默認值的偏移量與輸入字符串的偏移量混淆在一起。默認值僅在解析失敗時使用。

  • 如果要控制偏移量而不是將其包含在輸入中,請使用LocalDateTimePattern而不是OffsetDateTimePattern來進行解析。分析後,您可以將其與特定區域關聯。

  • 另外,請注意您的命名約定。 int timeZone沒有意義(這是一個偏移量,而不是時區)。也許int offsetHours,或更好的,Offset timeZoneOffset

+0

1.嗯,如果沒關係,那麼我只會使用任何作品!謝謝!會試試這個。 3.我真的不知道/理解偏移/時區的區別;一直認爲他們意味着同樣的事情。 – theGreenCabbage

+1

看看[時區標記wiki](http://stackoverflow.com/tags/timezone/info)。特別是「時區!=偏移」部分。您可能還需要閱讀相關的[DST標記wiki](http://stackoverflow.com/tags/dst/info)。 –

+0

非常感謝馬特。 Unix時間轉換器完美運行。你有一種方法可以完成與unix時間完全相反的方法嗎?輸入是unix時間,它以日期時間出現。 – theGreenCabbage