định dạng ngày yyyy-MM-ddTHH: mm: ssZ


102

Tôi cho rằng điều này khá đơn giản, nhưng không thể hiểu được :(. Ở định dạng này, Z là múi giờ.
T là mẫu thời gian dài
Làm thế nào tôi có thể lấy ngày ở định dạng này ngoại trừ bằng cách sử dụng

DateTime dt = DateTime.Now;
Console.WriteLine(dt.ToString("yyyy-MM-ddTHH:mm:ssZ"));

trong C #


Tôi biết câu hỏi này đã xuất hiện được 9 năm nhưng câu trả lời được chấp nhận UtcNow.ToString(s)+Zlà câu sai. ISO8601 được hỗ trợ bởi tùy chọn RoundTripToString("O") . Cũng để chỉ ra rằng câu trả lời được chấp nhận sử dụng giá trị UTC của ngày giờ, sẽ luôn cung cấp múi giờ Z, thay vì chỉ sử dụng giá trị ngày giờ thực tế, (nếu Kind = Local) có thể chứa múi giờ tiết kiệm ánh sáng ban ngày. Cân nhắc thay đổi câu trả lời được chấp nhận?
Richardissimo

Câu trả lời:


144

Sử dụng UTC

ISO 8601 ( định dạng ngày giờ MSDN )

Console.WriteLine(DateTime.UtcNow.ToString("s") + "Z");

2009-11-13T10: 39: 35Z

Chữ Z ở đó bởi vì

Nếu thời gian là UTC, hãy thêm 'Z' ngay sau thời gian mà không có dấu cách. 'Z' là ký hiệu vùng cho độ lệch UTC bằng không. Do đó, "09:30 UTC" được biểu thị là "09: 30Z" hoặc "0930Z". "14:45:15 UTC" sẽ là "14: 45: 15Z" hoặc "144515Z".

Nếu bạn muốn bao gồm một phần bù

int hours = TimeZoneInfo.Local.BaseUtcOffset.Hours;
string offset = string.Format("{0}{1}",((hours >0)? "+" :""),hours.ToString("00"));
string isoformat = DateTime.Now.ToString("s") + offset;
Console.WriteLine(isoformat);

Hai điều cần lưu ý: + hoặc - là cần thiết sau thời gian nhưng rõ ràng + không hiển thị trên các số dương. Theo wikipedia, độ lệch có thể ở định dạng + hh hoặc + hh: mm. Tôi đã giữ chỉ vài giờ.

Theo như tôi biết, RFC1123 (ngày HTTP, định dạng "u") không có nghĩa là cung cấp hiệu số múi giờ. Tất cả thời gian đều là GMT / UTC.


Mát mẻ. Tuy nhiên, đầu ra của bạn không bao gồm bù TZ?
Neil Barnwell

Tôi đã thêm nó vào - các tài liệu nói rằng định dạng 's' dựa trên ISO8601. Tôi không nghĩ nó bao gồm múi giờ.
Chris S

Tất nhiên, UTC không có múi giờ. Ồ. Anh ấy đang yêu cầu thông tin múi giờ trong đầu ra của mình. Có lẽ DateTimeOffset là thứ anh ấy đang tìm kiếm?
Neil Barnwell,

5
Thêm Z vào đó theo cách thủ công là không tốt, bạn nên sử dụng .ToString ("o") vì nó sẽ cung cấp cho bạn đầu ra thích hợp. Nếu mili giây là vấn đề, chúng nên được làm tròn. Thêm Z theo cách thủ công có thể cho kết quả không chính xác nếu bạn thêm nó vào giờ địa phương, không thực sự là UTC.
Tuukka Lindroos

67
Console.WriteLine(DateTime.UtcNow.ToString("o"));  
Console.WriteLine(DateTime.Now.ToString("o"));

Kết quả đầu ra:

2012-07-09T19:22:09.1440844Z  
2012-07-09T12:22:09.1440844-07:00

Tôi đã sử dụng Console.WriteLine (DateTime.Now.ToString ("o")) ;. Cảm ơn
Ziggler

5
Câu trả lời được chấp nhận cho biết sử dụng từ định dạng "s" và thêm chữ Z vào cuối cho các ngày UTC. Đó là tất cả tốt và tốt nếu bạn không cần mili giây, nhưng nếu bạn muốn mili giây, bạn phải sử dụng "o" như câu trả lời này cho thấy. Với "o", mili giây hiển thị theo mặc định và chữ Z đã được thêm vào cuối cho các ngày UTC.
Jim

1
DateTime.Now.ToString ("o") Giải quyết tất cả các loại vấn đề vì nó trả về phần bù đúng với nó.
Mo Zaatar

12

Định dạng "o" khác nhau cho DateTime và DateTimeOffset :(

DateTime.UtcNow.ToString("o") -> "2016-03-09T03:30:25.1263499Z"

DateTimeOffset.UtcNow.ToString("o") -> "2016-03-09T03:30:46.7775027+00:00"

Câu trả lời cuối cùng của tôi là

DateTimeOffset.UtcDateTime.ToString("o")   //for DateTimeOffset type
DateTime.UtcNow.ToString("o")              //for DateTime type

7

Trong C # 6+, bạn có thể sử dụng nội suy chuỗi và làm cho điều này ngắn gọn hơn:

$"{DateTime.UtcNow:s}Z"

bạn đã tiết kiệm rất nhiều thời gian của tôi. Giải pháp đơn giản và ngọt ngào.
Raju Paladiya



5

Một tùy chọn có thể là chuyển đổi DateTime thành ToUniversalTime () trước khi chuyển đổi thành chuỗi sử dụng định dạng "o" . Ví dụ,

var dt = DateTime.Now.ToUniversalTime();
Console.WriteLine(dt.ToString("o"));

Nó sẽ xuất ra:

2016-01-31T20:16:01.9092348Z

2

Nó hoạt động tốt với các định dạng ngày giờ truy vấn API Salesforce REST

DateTime now = DateTime.UtcNow;
string startDate = now.AddDays(-5).ToString("yyyy-MM-ddTHH\\:mm\\:ssZ");   
string endDate = now.ToString("yyyy-MM-ddTHH\\:mm\\:ssZ");  
//REST service Query 
string salesforceUrl= https://csxx.salesforce.com//services/data/v33.0/sobjects/Account/updated/?start=" + startDate + "&end=" + endDate;

// https://csxx.salesforce.com/services/data/v33.0/sobjects/Account/updated/?start=2015-03-10T15:15:57Z&end=2015-03-15T15:15:57Z

Nó trả về kết quả từ Salesforce mà không có bất kỳ vấn đề nào.


-6

Bạn có thể chia nhỏ mọi thứ, nó sẽ yêu cầu nhiều mã hơn nhưng sẽ hoạt động theo cách bạn muốn:

DateTime year = DateTime.Now.Year;
DateTime month = DateTime.Now.Month;
DateTime day = DateTime.Now.Day;

Vân vân.

cuối cùng:

Console.WriteLine(year+month+day+etc.);

Đây là một cách xử lý rất táo bạo mặc dù ...


Câu trả lời này sản xuất không có gì giống như mong muốn đầu ra
CJA

Didnot này cung cấp những gì các câu hỏi hoặc tôi muốn ... -1
Ziggler
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.