2015-11-01 17 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である(と私はZが最後の部分で、それはUTCだことが示された、ISO形式で読んだことに基づいて)

私の結果変数は現在2015-11-06T13:00:00 NZ (+13)

ですが、私が正しい経路にいるかどうかはわかりません。

ここに私が本当に欲しいものがあります。 UTCは、その後、その後、longデータ型に変換しよう

  • そして、それをデータベースに保存するよう

    1. 次の形式でNodaTimeオブジェクトにdateInput(日付文字列)に変換dd/MM/yyyy
    2. そして、それを持っています保存されたデータを取得し、特定のタイムゾーンを使用します。いいえ。Asia/Hong_Kong

    可能でしょうか?

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

    私は、ユーザーが入力のみdate06/11/2015は、データベースに保存すると、私はそれが現在の時間です(ユーザの現在の時間)が必要と言うことができ、このスニペットと、このシナリオを持っています視聴目的のために。私がlongに変換する理由は、Entity Frameworkを使用しているためです。

    これはお勧めですか?

  • +0

    あなたの編集に関する質問 - なぜこのシナリオでは日付を入力するのですか?あなたは現在の日付と時刻で注文をタイムスタンプしているようです。 –

    +0

    @MattJohnsonこれは私が思いついたアイデアです。私はそれが意味をなさないことを認識しています。私はそれを削除する必要があると思う。 –

    +0

    ええ、ちょうどタイムスタンプしていたら、 'SystemClock.Instance.Now'を使って現在のUTCベースの' Instant'を取得するのと同じように、残りの部分は適用されません。あるいは、あなたのdbに 'DateTime.UtcNow'やそれに類する関数を使用すれば、Noda Timeはまったく必要ありません。 –

    答えて

    5

    私は若干異なる観点から答えます。 Entity Frameworkを使用していたため、longに変換していたとしました。それはおそらく必要ではないでしょう。

    カレンダーの日付をラウンドトリップしようとしているようです。特定の時間がない場合(真夜中や初日など)、そのタイムゾーンに関係なくすべてのユーザーに同じ年月日が表示されるようにするには、より良い(IMHO)プロセス全体を通してこれらの言葉で物事を保つ。

    一部は「常にUTCで保存」することにするが、そのアドバイスは、2つの一般的なシナリオでは、最大保持していない一般的なベストプラクティスと、この反論になります。

    1. 「私は地元を持っています日付と時刻は未定ですが、私はスケジューリングの目的でそれらを使用しています。

    2. 「私はちょうど1日の時間なしにカレンダーの日付を使って作業しています。それは過去または現在の過去かもしれませんが、ユニークな瞬間ではなく人間中心の市民日付です。。「

    そう後者の場合にあるように表示されます。

    • は、SQL Serverでは、PostgreSQLで使用可能なDATEタイプとして、データベース内の日付のみのタイプを使用しますMySQLの、Oracle、および他のほとんどのリレーショナルデータベース。

    • 野田時間でLocalDateタイプを使用してください。LocalDateTimeInstantに変換しようとしないでください、ZonedDateTime、またはlong

    • 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'となります) –

    関連する問題