2009-11-30 37 views
48

Tôi có một DateTime mà tôi muốn định dạng thành "2009-09-01T00: 00: 00.000Z", nhưng mã sau đây cho tôi "2009-09-01T00: 00: 00.000 + 01: 00" (cả hai dòng) :Làm cách nào để định dạng DateTime thành định dạng UTC trên web?

new DateTime(2009, 9, 1, 0, 0, 0, 0, DateTimeKind.Utc).ToString("yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'fffzzz") 
new DateTime(2009, 9, 1, 0, 0, 0, 0, DateTimeKind.Utc).ToUniversalTime().ToString("yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'fffzzz") 

Mọi ý tưởng về cách làm cho nó hoạt động?

Trả lời

99
string foo = yourDateTime.ToUniversalTime() 
         .ToString("yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'fff'Z'"); 
+0

@Downvoter: Bạn có muốn cho chúng tôi biết bạn nghĩ gì sai với câu trả lời này không? – LukeH

+10

Điều này làm việc nhưng .ToUniversalTime() sẽ mess up ngày hiện tại của bạn nếu nó đã ở UTC nhưng biến yourDateTime không xác định nó. Tôi đã kết thúc việc loại bỏ .ToUniversalTime() và các ngày sau đó xếp hàng với những gì được mong đợi ở cả hai đầu (cơ sở dữ liệu và máy khách web). –

-2

Hãy thử điều này:

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

Previously asked question

+3

Tôi không cố gắng để phân tích nó (chưa), tôi đang cố in nó ra. – Grzenio

3

Bạn muốn sử dụng DateTimeOffset lớp.

var date = new DateTimeOffset(2009, 9, 1, 0, 0, 0, 0, new TimeSpan(0L)); 
var stringDate = date.ToString("u"); 

xin lỗi tôi bị mất định dạng ban đầu của bạn với miliseconds

var stringDate = date.ToString("yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'fff'Z'"); 
6

Định dạng tốt nhất để sử dụng là "yyyy '-' MM '-' dd'T'HH ':' mm ':' ss '.' fffK ".

K cuối cùng trên chuỗi sẽ được đổi thành 'Z' nếu ngày là UTC hoặc với múi giờ (+ -hh: mm) nếu là địa phương. (http://msdn.microsoft.com/en-us/library/8kb3ddd4.aspx)

Như LukeH đã nói, bạn nên sử dụng ToUniversalTime nếu muốn tất cả các ngày đều là UTC.

Mã cuối cùng là:

string foo = yourDateTime.ToUniversalTime() 
         .ToString("yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'fffK"); 
42

Tại sao không chỉ cần sử dụng The Round-trip ("O", "o") Format Specifier?

Trình định dạng định dạng chuẩn "O" hoặc "o" biểu thị chuỗi ngày và giờ tùy chỉnh sử dụng mẫu lưu giữ thông tin múi giờ và phát ra chuỗi kết quả tuân theo ISO 8601. specifier được thiết kế để bảo tồn các giá trị ngày tháng và thời gian cùng với thuộc tính DateTime.Kind trong văn bản. Chuỗi định dạng có thể được phân tích cú pháp trở lại bằng cách sử dụng phương thức DateTime.Parse (String, IFormatProvider, DateTimeStyles) hoặc DateTime.ParseExact nếu tham số kiểu được đặt thành DateTimeStyles.RoundtripKind.

Trình định dạng định dạng chuẩn "O" hoặc "o" tương ứng với "yyyy" - 'MM' - 'dd'T'HH': 'mm': 'ss'. 'FffffffK "chuỗi định dạng tùy chỉnh cho DateTime các giá trị và cho "yyyy" - 'MM' - 'dd'T'HH': 'mm': 'ss'. 'fffffffzzz' chuỗi định dạng tùy chỉnh cho các giá trị DateTimeOffset. Trong chuỗi này, các cặp dấu nháy đơn phân định các ký tự riêng lẻ, chẳng hạn như dấu gạch nối, dấu hai chấm và chữ cái "T", cho biết ký tự riêng lẻ là chữ không thể thay đổi. Các dấu nháy đơn không xuất hiện trong chuỗi đầu ra.

Trình định dạng định dạng chuẩn O "hoặc" o "(và" yyyy "- 'MM' - 'dd'T'HH': 'mm': 'ss'. 'FffffffK" chuỗi định dạng tùy chỉnh) tận dụng lợi thế trong ba cách mà ISO 8601 đại diện cho thông tin múi giờ để bảo vệ tài sản Loại giá trị DateTime:

public class Example 
{ 
    public static void Main() 
    { 
     DateTime dat = new DateTime(2009, 6, 15, 13, 45, 30, 
            DateTimeKind.Unspecified); 
     Console.WriteLine("{0} ({1}) --> {0:O}", dat, dat.Kind); 

     DateTime uDat = new DateTime(2009, 6, 15, 13, 45, 30, 
            DateTimeKind.Utc); 
     Console.WriteLine("{0} ({1}) --> {0:O}", uDat, uDat.Kind); 

     DateTime lDat = new DateTime(2009, 6, 15, 13, 45, 30, 
            DateTimeKind.Local); 
     Console.WriteLine("{0} ({1}) --> {0:O}\n", lDat, lDat.Kind); 

     DateTimeOffset dto = new DateTimeOffset(lDat); 
     Console.WriteLine("{0} --> {0:O}", dto); 
    } 
} 
// The example displays the following output: 
// 6/15/2009 1:45:30 PM (Unspecified) --> 2009-06-15T13:45:30.0000000 
// 6/15/2009 1:45:30 PM (Utc) --> 2009-06-15T13:45:30.0000000Z 
// 6/15/2009 1:45:30 PM (Local) --> 2009-06-15T13:45:30.0000000-07:00 
//  
// 6/15/2009 1:45:30 PM -07:00 --> 2009-06-15T13:45:30.0000000-07:00 
+0

Trong thẻ meta như 'http-equiv =" sửa đổi lần cuối ", định dạng là *** 2013-10-23 @ 17: 23: 00 UTC ***, có thể không? –

3

Một số người đã chỉ ra rằng 'ToUniversalTime' có phần không an toàn ở chỗ nó có thể gây ra không lường dispalys thời gian không chính xác Mẫu mở rộng ở đây tạo ra một phần mở rộng cho đối tượng DateTime trả về một cách an toàn một UTC DateTime, nơi bạn có thể sử dụng ToString như mong muốn….

class Program 
{ 
    static void Main(string[] args) 
    { 
     DateTime dUtc = new DateTime(2016, 6, 1, 3, 17, 0, 0, DateTimeKind.Utc); 
     DateTime dUnspecified = new DateTime(2016, 6, 1, 3, 17, 0, 0, DateTimeKind.Unspecified); 

     //Sample of an unintended mangle: 
     //Prints "2016-06-01 10:17:00Z" 
     Console.WriteLine(dUnspecified.ToUniversalTime().ToString("u")); 

     //Prints "2016 - 06 - 01 03:17:00Z" 
     Console.WriteLine(dUtc.SafeUniversal().ToString("u")); 

     //Prints "2016 - 06 - 01 03:17:00Z" 
     Console.WriteLine(dUnspecified.SafeUniversal().ToString("u")); 
    } 
} 

public static class ConvertExtensions 
{ 
    public static DateTime SafeUniversal(this DateTime inTime) 
    { 
     return (DateTimeKind.Unspecified == inTime.Kind) 
      ? new DateTime(inTime.Ticks, DateTimeKind.Utc) 
      : inTime.ToUniversalTime(); 
    } 
} 
1
string.Format("{0:yyyy-MM-ddTHH:mm:ss.FFFZ}", DateTime.UtcNow) 

lợi nhuận 2017-02-10T08: 12: 39.483Z

0

Mã này đang làm việc cho tôi:

var datetime = new DateTime(2017, 10, 27, 14, 45, 53, 175, DateTimeKind.Local); 
var text = datetime.ToString("o"); 
Console.WriteLine(text); 
-- 2017-10-27T14:45:53.1750000+03:00 

// datetime from string 
var newDate = DateTime.ParseExact(text, "o", null); 
Các vấn đề liên quan