web-dev-qa-db-ja.com

c#UTC日時の解析

11/23/2011 23:59:59 UTC +0800をc#日時オブジェクトとして解析しようとしていますが、標準の日時解析メソッドまたは日時の正確な解析を試行しても、無効な日付が取得されます。

何か案は?

18
lee

フォーマット文字列でDateTimeOffsetの代わりにDateTimeに解析することをお勧めします タイムゾーンオフセット指定子を使用するときにMSDNで推奨されているように

using System;
using System.Globalization;

class Test
{    
    static void Main(string[] args)
    {
        string text = "11/23/2011 23:59:59 UTC +0800";
        string pattern = "MM/dd/yyyy HH:mm:ss 'UTC' zzz";

        DateTimeOffset dto = DateTimeOffset.ParseExact
            (text, pattern, CultureInfo.InvariantCulture);
        Console.WriteLine(dto);
    }
}

必要に応じて、それをUTCのDateTime値に変換できますが、「8時間のオフセットを持つDateTime」のようなものはありません-DateTimeはユニバーサル、ローカル、または指定されていないものと見なされ、特定のオフセットを格納する場所がありません。

DateTimeさまざまな方法で好奇心が強いタイプ であり、不注意な開発者に問題を引き起こす可能性があります。

31
Jon Skeet

フォーマット設定のMSDN: https://msdn.Microsoft.com/en-us/library/az4se3k1(v = vs.110).aspx

public class Program
{
    public static void Main()
    {
         //original date
        string _date = "Thu Jan 15 11:32:09 +0200 2015";
         // Describes the date format
        string _parsePattern = "ddd MMM dd HH:mm:ss zzz yyyy"; 

         DateTimeOffset dto = DateTimeOffset.ParseExact(_date, _parsePattern, CultureInfo.InvariantCulture);

         //last settings
        Console.WriteLine(dto.ToString("dd.MM.yyyy hh:mm:ss",CultureInfo.CreateSpecificCulture("tr-TR")));
    }
}

拡張メソッドの場合:

public static DateTime getDateFromFormat(this string _date, string _parsePattern)
        {
            DateTimeOffset dto = DateTimeOffset.ParseExact(_date, _parsePattern, CultureInfo.InvariantCulture);
            return Convert.ToDateTime(dto.ToLocalTime());
        }

テストの場合: https://dotnetfiddle.net/xdnjGy

1
Hakkı Eser

ParseExactを使用する必要があると思います http://msdn.Microsoft.com/en-us/library/w2sa9yss.aspx

0
JamesStuddart

ジェームズが書いたように、あなたは試すことができます

var dt = DateTime.ParseExact(
         "11/23/2011 23:59:59 UTC +0800", 
         "MM/dd/yyyy HH:mm:ss 'UTC' K", 
          CultureInfo.InvariantCulture);

「現地時間」で日付を取得します。

0
xanatos