2017-05-23 5 views
0

文字列2017-06-02T00:00:00 + 05:30を.netで解析し、日時の値を2017-06-02:00:00:00として取得したい。サーバーがこの日付を東部時間帯に変換していることを意味します。しかし、私は与えられた時間帯にそれを保存したい。どんな助けもありがたい。サーバ上の.netの日付タイムゾーンの問題

+0

与えられたタイムゾーンは05:30から解析されるか、または指定されたタイムゾーンは東部標準時です。私は05:30は複数の選択肢のタイムゾーンかもしれないことを意味します。 – ntohl

+0

また、どのような状況でも05:30をタイムゾーンに解析しないように注意してください> http://infiniteundo.com/post/25509354022/more-falsehoods-programmers-believe-about-time – ntohl

+1

「DateTime」タイプはタイムゾーン情報を保持する。あなたは、ローカルまたはUTC時間のみを得ることができます。オフセットを保持する場合は、DateTimeOffset –

答えて

-1
CultureInfo culture = CultureInfo.CreateSpecificCulture("en-US"); 
DateTime dt = DateTime.ParseExact("2017-06-02T00:00:00+05:30", "yyyy-MM-ddTHH:mm:sszzz", culture); 
+0

を使用する必要があります。これを行った後、東部時間帯の日付が変換されます。私は私が与えたのと同じタイムゾーンでdatetimeが必要です。たとえば、この「2017-06-02T12:30:00 + 05:30」が「2017-06-02 12:30:00」として必要です。しかし、あなたの解決策を適用した後、私は2017-06-01 3:00 PM –

+0

はい。しかし、 '.Kind'プロパティは異なります。これは、適切な時間を持って、サーバーのローカルに変換されます。コンピュータはあなたが何時になるかを知っています。あなたがEasternのためにもう一度それを出力すれば、それは適切な時を示すでしょう。 –

+0

[編集]リンクを使用して、このコードの仕組みを説明し、コードを提供するだけではありません。将来の読者に役立つ可能性が高いためです。 [回答]も参照してください。 [ソース](http://stackoverflow.com/users/5244995) –

0

私はのDateTimeOffsetを使用すると、あなたが必要なものを与えると確信しています。

CultureInfo culture = CultureInfo.CreateSpecificCulture("en-US"); 
string dateString = "2017-06-02T00:00:00+05:30"; 
DateTimeOffset offset = DateTimeOffset.Parse(dateString, culture); 
// adjustedDateTime should contain 6/2/2017 12:00:00 AM. There are other properties on offset such as LocalDateTime to provide other options 
DateTime adjustedDateTime = offset.DateTime; 
1

あなたの入力はタイムゾーンオフセットが含まれている、とあなたは.Kind == DateTimeKind.UnspecifiedDateTimeを求めているように見えるので、あなたは、少なくともではない、あなたの入力文字列を変更することなく、DateTime.ParseまたはDateTime.ParseExactを使用することはできません。カスタムフォーマッタ(Kzzzなど)とDateTimeStylesを組み合わせて指定しないと、指定しない種類のDateTimeが返されます。彼らは常にオフセットでピックアップし、あなたが現地時間またはUTCのどちらかが必要であると仮定します。

だから、いくつかの選択肢があります。

  1. 解析する前に文字列を変更して、オフセットを切り捨てます。 DateTimeOffsetとして

    string s = "2017-06-02T00:00:00+05:30"; 
    DateTime dt = DateTime.ParseExact(s.Substring(0, 19), 
                "yyyy-MM-dd'T'HH:mm:ss", 
                CultureInfo.InvariantCulture); 
    
  2. 解析、そしてDateTimeプロパティを取ります。

    string s = "2017-06-02T00:00:00+05:30"; 
    DateTimeOffset dto = DateTimeOffset.ParseExact(s, 
                "yyyy-MM-dd'T'HH:mm:sszzz", 
                CultureInfo.InvariantCulture); 
    DateTime dt = dto.DateTime; 
    

は個人的に、私はあなたも、ちょうど全体DateTimeOffsetを使用することを検討してオプション2を好みます。これは通常、ほとんどのシナリオに適しています。

また、この形式を定義するISO-8601仕様では常にグレゴリオ暦システムが使用されるため、この形式の文字列を解析するときは、不変のカルチャがローカルの文化よりも優先されることに注意してください。他のカルチャーを使用している場合は、別のカレンダーシステムの数値を解釈することができます。これによりエラーが発生する可能性があります。

+0

ありがとうマットは、今働いている。 –

関連する問題