簡體   English   中英

如何解析這種格式的日期時間?

[英]how to parse datetime from this format?

我有不同的日期時間格式。 嘗試解析時出現錯誤“ System.FormatException”。 我該如何解析?

    ?time
"20170620 21:22:02 EST"

?DateTime.Parse(time)
'DateTime.Parse(time)' threw an exception of type 'System.FormatException'
    Data: {System.Collections.ListDictionaryInternal}
    HResult: -2146233033
    HelpLink: null
    InnerException: null
    Message: "String was not recognized as a valid DateTime."
    Source: "mscorlib"
    StackTrace: "   at System.DateTimeParse.Parse(String s, DateTimeFormatInfo dtfi, DateTimeStyles styles)\r\n   at System.DateTime.Parse(String s)"
    TargetSite: {System.DateTime Parse(System.String, System.Globalization.DateTimeFormatInfo, System.Globalization.DateTimeStyles)}

由於偏移量是硬編碼的,或者存在數據庫派生,因此發布的答案都無法解決夏令時問題。

EST比UTC晚5小時,因此使用DateTime.ParseExact可能適合您的需求:

String time = "20170620 21:22:02 EST";

DateTime.ParseExact(time.Replace("EST", "-05:00"), "yyyyMMdd HH:mm:ss zzz", CultureInfo.InvariantCulture);

UTC結果:

6/21/2017 2:22:02 AM

注意:根據IANA的數據,某些時區縮寫根據區域性而具有不同的關聯,因此沒有確切的方法來定義應解析的時區,而不是在應用程序上下文中定義它們(可能使用硬編碼值)。

.NET小提琴示例

DateTime.Parse()方法無法識別您當前的日期時間字符串,因此您需要將其重新格式化為該方法可以理解的格式之一。 對於該問題,以下代碼片段可能會有點過分:-),但可以處理很多情況。

//  "20170620 21:22:02 EST" -> "wrong" format
//  "2017-06-20T21:22:02 -05:00" -> correct format
String input = "20170620 21:22:02 EST";
String temp = input;

//  Handle US time zones.
String[] timeZones = {"AST", "EST", "EDT", "CST", "CDT", "MST", "MDT", "PST", "PDT", "AKST", "AKDT", "HST", "HAST", "HADT", "SST", "SDT", "CHST"};

Int32[] utcOffsets = { -4, -5, -4, -6, -5, -7, -6, -8, -7, -9, -8, -10, -10, -9, -11, -10, 10 };

//  Correct the timezone part
for (int i = 0; i < timeZones.Length; i++)
{
    String timeZonePattern = @"\b" + timeZones[i] + @"\b";
    String timeZoneReplPattern = String.Format("{0}:00", utcOffsets[i].ToString("+00;-00"));

    temp = Regex.Replace(input, timeZonePattern, timeZoneReplPattern);
    if (temp != input)
    {
        break;
    }
}

//  Correct the date part
String datePattern = @"(?<year>[\d]{4})(?<month>[0][1-9]|[1][0-2])(?<day>[0][1-9]|[1-2][0-9]|3[0-1])\s*";
String dateReplPattern = @"${year}-${month}-${day}T";
temp = Regex.Replace(temp, datePattern, dateReplPattern);

//  Now we should have a correct date time string
DateTime dt;
try
{
    dt = DateTime.Parse(temp);
}
catch (Exception ex)
{
    Console.WriteLine(ex.Message);
}

希望這會有所幫助。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM