2009-11-18 49 views

Trả lời

55

Không thể phân tích cú pháp chuỗi đó vì "UTC" không phải là trình chỉ định múi giờ hợp lệ.

thời gian tính theo giờ UTC được ký hiệu bằng cách thêm một 'Z' để kết thúc chuỗi thời gian, do đó, mã phân tích của bạn sẽ giống như thế này:

DateTime.Parse("Tue, 1 Jan 2008 00:00:00Z"); 

Từ Wikipedia article on ISO 8601

Nếu thời gian đang ở dạng UTC, hãy thêm trực tiếp 'Z' sau thời gian không có không gian . 'Z' là trình chỉ định vùng cho chênh lệch UTC bằng không. "09:30 UTC" là do đó được biểu thị là "09: 30Z" hoặc "0930Z". "14:45:15 UTC" sẽ là "14: 45: 15Z" hoặc "144515Z".

Thời gian UTC còn được gọi là thời gian 'Zulu', vì 'Zulu' là từ ngữ theo ngữ điệu NATO từ bảng chữ cái cho 'Z'.

+1

Chuỗi ngày trong ví dụ của tôi đến từ internet explorer – Dve

+0

@Dave: Khi bạn nói nó đến từ IE, bạn có nghĩa là bạn trích xuất nó từ một trang web? Bạn có thể phải viết thay thế của riêng bạn cho trình phân tích cú pháp DateTime trích xuất UTC và thay thế nó bằng Z. –

+0

Sau khi thử nghiệm với FF, tôi đã quên tôi đã gọi phương thức toUTCString() vào ngày tôi POST trở lại máy chủ. FF gửi GMT trong khi IE gửi UTC. Vì vậy, tôi không thể đổ lỗi cho IE ... lần này! – Dve

-3

Không chắc tại sao, nhưng bạn có thể quấn DateTime.ToUniversalTime trong một try/catch và đạt được cùng một dẫn đến nhiều mã hơn.

Chúc may mắn.

+0

ToUniversalTime không bao giờ ném một ngoại lệ – porges

13

Bạn cần phải xác định định dạng:

DateTime date = DateTime.ParseExact(
    "Tue, 1 Jan 2008 00:00:00 UTC", 
    "ddd, d MMM yyyy HH:mm:ss UTC", 
    CultureInfo.InvariantCulture); 
+2

Đề xuất hay, nhưng điều này sẽ thất bại nếu chuỗi ngày tháng được cung cấp không chứa UTC ở cuối. Thay vào đó, bạn đã chuyển một chuỗi ngày có +01 ở cuối, nó sẽ gây ra một FormatException. Phụ thuộc vào những gì anh ấy đang cố gắng làm. –

10

hoặc sử dụng AdjustToUniversal DateTimeStyle trong một cuộc gọi đến

DateTime.ParseExact(String, String[], IFormatProvider, DateTimeStyles) 
+0

Ive đã thử điều đó, và nó dường như không hoạt động – Dve

+4

Điều này thực sự hoạt động. Tôi đã sử dụng mã này và nhận đúng UTC DateTime từ chuỗi UTC: DateTime.TryParseExact ("2012-01-30T00: 28: 00Z", "yyyy-MM-ddTHH: mm: ssZ", CultureInfo.InvariantCulture, DateTimeStyles.AdjustToUniversal, out timeValue)); – Roboblob

+15

Công cụ này cũng hoạt động, sử dụng trong và ngoài, không có định dạng, không yêu cầu Z: DateTime.Parse ("8/3/2013 1:02:41 AM", CultureInfo.InvariantCulture, DateTimeStyles.AdjustToUniversal | DateTimeStyles.AssumeUniversal); – crokusek

6

Nó không phải là một định dạng hợp lệ, tuy nhiên "Tue, 01 Tháng một 2008 00 : 00: 00 GMT "là.

Các tài liệu nói như thế này:

Một chuỗi bao gồm thông tin múi giờ và phù hợp với tiêu chuẩn ISO 8601. Ví dụ, người đầu tiên của hai chuỗi kí tự sau chỉ định Coordinated Universal Time (UTC); thứ hai chỉ định thời gian trong một múi giờ bảy tiếng đồng hồ sớm hơn UTC:

2008-11-01T19: 35: 00.0000000Z

Một chuỗi bao gồm các vấn thiết kế GMT và phù hợp với các định dạng thời gian RFC 1123. Ví dụ:

Sat, 01 Nov 2008 19:35:00 GMT

Chuỗi bao gồm ngày và giờ cùng với thông tin bù múi giờ. Ví dụ:

03/01/2009 05:42:00 -5: 00

+0

Một thay thế đơn giản của "UTC" với "GMT" trong một chuỗi ngày tương tự như định dạng này hoạt động tuyệt vời, cảm ơn cho tip. –

+1

Mặc dù lưu ý rằng điều này trả về 'DateTime' với' Loại 'của' Local' cho tôi. Có vẻ như cách giải quyết khác là sử dụng [DateTimeOffset.Parse] (http://stackoverflow.com/a/14774345/1028230) (và sau đó là 'x.UtcDateTime') nếu bạn muốn đảm bảo rằng bạn không rơi khỏi UTC toa xe trong khi phân tích cú pháp của bạn. – ruffin

5

Để phân tích một cách chính xác các chuỗi được đưa ra trong câu hỏi mà không thay đổi nó, sử dụng như sau:

using System.Globalization; 

string dateString = "Tue, 1 Jan 2008 00:00:00 UTC"; 
DateTime parsedDate = DateTime.ParseExact(dateString, "ddd, d MMM yyyy hh:mm:ss UTC", CultureInfo.CurrentCulture, DateTimeStyles.AssumeUniversal); 

này triển khai sử dụng một chuỗi để chỉ định định dạng chính xác của chuỗi ngày đang được phân tích cú pháp.Tham số DateTimeStyles được sử dụng để xác định rằng chuỗi đã cho là chuỗi thời gian chung được phối hợp.

8

Giả sử bạn sử dụng định dạng "o" cho ngày giờ của bạn để bạn có "2016-07-24T18: 47: 36Z", có một cách rất đơn giản để xử lý việc này.

Gọi DateTime.Parse("2016-07-24T18:47:36Z").ToUniversalTime().

Điều gì xảy ra khi bạn gọi DateTime.Parse("2016-07-24T18:47:36Z") là bạn nhận được DateTime được đặt thành múi giờ địa phương. Vì vậy, nó chuyển đổi nó thành giờ địa phương.

ToUniversalTime() thay đổi thành UTC DateTime và chuyển đổi trở lại thời gian UTC.

+0

Tôi đã đập đầu mình hàng giờ vào cái này ... thx! – Corelgott

1

Chỉ cần sử dụng rằng:

var myDateUtc = DateTime.SpecifyKind(DateTime.Parse("Tue, 1 Jan 2008 00:00:00"), DateTimeKind.Utc); 

if (myDateUtc.Kind == DateTimeKind.Utc) 
{ 
    Console.WriteLine("Yes. I am UTC!"); 
} 

Bạn có thể kiểm tra mã này bằng cách sử dụng trực tuyến C# biên dịch:

http://rextester.com/

Tôi hy vọng nó giúp.

0

Chỉ cần thay thế "UTC" với "GMT" - đơn giản và không phá vỡ ngày định dạng đúng:

DateTime.Parse("Tue, 1 Jan 2008 00:00:00 UTC".Replace("UTC", "GMT")) 
Các vấn đề liên quan