Đưa ra một đối tượng DateTime, làm cách nào để có được ngày ISO 8601 ở định dạng chuỗi?


790

Được:

DateTime.UtcNow

Làm cách nào để có được một chuỗi đại diện cho cùng một giá trị theo định dạng ISO 8601 -compliant?

Lưu ý rằng ISO 8601 định nghĩa một số định dạng tương tự. Định dạng cụ thể tôi đang tìm kiếm là:

yyyy-MM-ddTHH:mm:ssZ

Câu trả lời:


780

Lưu ý cho độc giả: Một số bình luận đã chỉ ra một số vấn đề trong câu trả lời này (liên quan đặc biệt đến gợi ý đầu tiên). Tham khảo phần bình luận để biết thêm thông tin.

DateTime.UtcNow.ToString("yyyy-MM-ddTHH\\:mm\\:ss.fffffffzzz");

Điều này cung cấp cho bạn một ngày tương tự như 2008-09-22T13: 57: 31.2311892-04: 00 .

Một cách khác là:

DateTime.UtcNow.ToString("o");

mang đến cho bạn 2008-09-22T14: 01: 54.9571247Z

Để có được định dạng đã chỉ định, bạn có thể sử dụng:

DateTime.UtcNow.ToString("yyyy-MM-ddTHH:mm:ssZ")

Tùy chọn định dạng DateTime


20
Ngày nay, làm điều đó (cố gắng hiển thị thời gian UTC với phần bù, điều này không có ý nghĩa nhiều) sẽ tạo ra một ngoại lệ. Vì vậy, tôi đồng ý với những người khác rằng định dạng "s" với văn hóa bất biến có lẽ đúng hơn. Thông báo của FYI của formatexception là: "UTC DateTime đang được chuyển đổi thành văn bản theo định dạng chỉ đúng với giờ địa phương. Điều này có thể xảy ra khi gọi DateTime.ToString bằng cách sử dụng công cụ xác định định dạng 'z', sẽ bao gồm phần bù múi giờ địa phương ở đầu ra. "
Tom Lianza

9
Tôi sống ở Úc và đối với tôi, tôi phải sử dụng ToString("yyyy-MM-ddTHH:mm:ssK")nó để làm việc (với plugin timeago jquery tôi đang sử dụng).
GONeale

6
Nếu bạn muốn bao gồm phần bù múi giờ, hãy làm điều này: dt.ToString("s") + dt.ToString("zzz")// 2013-12-05T07: 19: 04-08: 00
alekop

4
Dấu gạch chéo (\ :) gây ra sự cố với chuỗi ... đặt ký tự @ để sử dụng chuỗi ký tự thay thế.
Gigi

6
@core: đó là một trong những Định dạng chuẩn, khác với Định dạng tùy chỉnh được liên kết: msdn.microsoft.com/en-us/l
Wayne

361

DateTime.UtcNow.ToString("s", System.Globalization.CultureInfo.InvariantCulture)sẽ cung cấp cho bạn những gì bạn đang tìm kiếm vì trình xác định định dạng "s" được mô tả dưới dạng mẫu ngày / giờ có thể sắp xếp; phù hợp với ISO 8601.


34
Tôi tin rằng đây là câu trả lời chính xác. Không có lý do nào để xác định rõ ràng yyyy-MM-etc nếu Microsoft đã triển khai ISO 8601. Phản hồi của Iain cũng đúng, nhưng bạn phải luôn chỉ định InvariantCocate (hoặc bất kỳ CultureInfo nào khác) vì nhiều lý do (không bao giờ giả sử .NET nên chỉ cần giả định). Bạn cũng có thể sử dụng: DateTime.UtcNow.ToString(CultureInfo.InvariantCulture.DateTimeFormat.SortableDateTimePattern); Tuy nhiên, vì tất cả các loại này đều loại trừ múi giờ, v.v., bạn có thể không có lựa chọn nào khác ngoài sử dụng định dạng rõ ràng, tức là"yyyy-MM-ddTHH:mm:ss.fffZ"
Jon Davis

20
Trong khi nó tuân thủ, nó rời khỏi múi giờ, Ztrông như thế này: DateTime.UtcNow.ToString(c, CultureInfo.InvariantCulture)) => 2012-06-26T11:55:36và không có độ phân giải mili giây nào là rất tốt để có được vì máy tính thực hiện một số lượng tích tắc mỗi giây.
Henrik

9
Với obạn có 2012-06-26T11:55:36.1007668Znghĩa là 36.1007668giây, vì vậy bạn có được độ phân giải xuống đến 1/10^7một giây. Từ ISO8601: 2004If a decimal fraction is included, lower order time elements (if any) shall be omitted and the decimal fraction shall be divided from the integer part by the decimal sign [...] the comma (,) or full stop (.)
Henrik


2
@binki - bây giờ tôi rất bối rối. Theo tài liệu tôi đã liên kết trước đó cho SortableDateTimePotype , nó nói rằng nó phải là văn hóa cụ thể. TUY NHIÊN, nó dường như bị mâu thuẫn bởi các ví dụ của chính nó (vì tất cả chúng trông giống nhau); thử DateTime.Now.ToString("s", new CultureInfo(myCulture)).
drzaus

87
DateTime.UtcNow.ToString("s")

Trả về một cái gì đó như 2008-04-10T06: 30: 00

UtcNowrõ ràng trả về thời gian UTC vì vậy không có hại trong:

string.Concat(DateTime.UtcNow.ToString("s"), "Z")

11
Chỉ cần quan tâm: Tại sao chuỗi.Concat () chứ không phải '+'?
Daniel Fortunov

2
Hợi, có sự khác biệt?
Iain

84
@KoenZomers: Tôi không nghĩ đó là chính xác. Tôi nghĩ rằng a + bbiên dịch thành mã trung gian giống như string.Concat(a, b)(tất nhiên giả sử rằng a và b là các chuỗi) vì vậy không có sự khác biệt về hiệu suất hoặc mức tiêu thụ bộ nhớ.
Mark Byers

78
Vâng, Mark là chính xác. Koen, bạn vừa rơi vào cái bẫy của một tối ưu hóa vi mô sớm vô lý, ngay cả khi bạn đúng.
Noldorin

7
@ greg84: Chà, bạn không hoàn toàn đúng. Hãy xem bài đăng này của kiến ​​trúc sư Microsoft Rico Mariani: blog.msdn.com/b/ricom/archive/2003/12/15/43628.aspx - ông nói a + b không biên dịch để concat + có thêm thông tin về cách sử dụng đúng StringBuilder.
mrówa

37

Sử dụng:

private void TimeFormats()
{
    DateTime localTime = DateTime.Now;
    DateTime utcTime = DateTime.UtcNow;
    DateTimeOffset localTimeAndOffset = new DateTimeOffset(localTime, TimeZoneInfo.Local.GetUtcOffset(localTime));

    //UTC
    string strUtcTime_o = utcTime.ToString("o");
    string strUtcTime_s = utcTime.ToString("s");
    string strUtcTime_custom = utcTime.ToString("yyyy-MM-ddTHH:mm:ssK");

    //Local
    string strLocalTimeAndOffset_o = localTimeAndOffset.ToString("o");
    string strLocalTimeAndOffset_s = localTimeAndOffset.ToString("s");
    string strLocalTimeAndOffset_custom = utcTime.ToString("yyyy-MM-ddTHH:mm:ssK");

    //Output
    Response.Write("<br/>UTC<br/>");
    Response.Write("strUtcTime_o: " + strUtcTime_o + "<br/>");
    Response.Write("strUtcTime_s: " + strUtcTime_s + "<br/>");
    Response.Write("strUtcTime_custom: " + strUtcTime_custom + "<br/>");

    Response.Write("<br/>Local Time<br/>");
    Response.Write("strLocalTimeAndOffset_o: " + strLocalTimeAndOffset_o + "<br/>");
    Response.Write("strLocalTimeAndOffset_s: " + strLocalTimeAndOffset_s + "<br/>");
    Response.Write("strLocalTimeAndOffset_custom: " + strLocalTimeAndOffset_custom + "<br/>");

}

ĐẦU RA

UTC
    strUtcTime_o: 2012-09-17T22:02:51.4021600Z
    strUtcTime_s: 2012-09-17T22:02:51
    strUtcTime_custom: 2012-09-17T22:02:51Z

Local Time
    strLocalTimeAndOffset_o: 2012-09-17T15:02:51.4021600-07:00
    strLocalTimeAndOffset_s: 2012-09-17T15:02:51
    strLocalTimeAndOffset_custom: 2012-09-17T22:02:51Z

Nguồn:


2
có vẻ như bạn là nạn nhân của việc sao chép tại tùy chỉnh cục bộ ;-) string strLocalTimeAndOffset_custom = localTimeAndOffset.ToString("yyyy-MM-ddTHH:mm:ssK");sẽ dẫn đến:strLocalTimeAndOffset_custom: 2012-09-17T22:02:51-07:00
Holly

olà định dạng ISO-8601.
Yousha Aleayoub

33
System.DateTime.UtcNow.ToString("o")

=>

val it : string = "2013-10-13T13:03:50.2950037Z"

Đồng ý rằng đây là cách duy nhất để hoàn toàn chắc chắn rằng bạn có một ngày / thời gian rõ ràng trên bất kỳ múi giờ nào
Matt Wilko

23

Bạn có thể lấy "Z" ( ISO 8601 UTC ) với mã tiếp theo:

Dim tmpDate As DateTime = New DateTime(Now.Ticks, DateTimeKind.Utc)
Dim res as String = tmpDate.toString("o") '2009-06-15T13:45:30.0000000Z


Đây là lý do tại sao:

ISO 8601 có một số định dạng khác nhau:

DateTimeKind. Tiêu điểm

2009-06-15T13:45:30.0000000-07:00

DateTimeKind.Utc

2009-06-15T13:45:30.0000000Z

DateTimeKind.Unspecified

2009-06-15T13:45:30.0000000


.NET cung cấp cho chúng ta một enum với các tùy chọn đó:

'2009-06-15T13:45:30.0000000-07:00
Dim strTmp1 As String = New DateTime(Now.Ticks, DateTimeKind.Local).ToString("o")

'2009-06-15T13:45:30.0000000Z
Dim strTmp2 As String = New DateTime(Now.Ticks, DateTimeKind.Utc).ToString("o")

'2009-06-15T13:45:30.0000000
Dim strTmp3 As String = New DateTime(Now.Ticks, DateTimeKind.Unspecified).ToString("o")

Lưu ý : Nếu bạn áp dụng "tiện ích đồng hồ" của Visual Studio 2008 cho phần toString ("o"), bạn có thể nhận được các kết quả khác nhau, tôi không biết đó có phải là lỗi không, nhưng trong trường hợp này bạn có kết quả tốt hơn khi sử dụng biến Chuỗi nếu bạn đang gỡ lỗi.

Nguồn: Chuỗi định dạng ngày và giờ chuẩn (MSDN)


20

Nếu bạn phải sử dụng DateTime đến ISO 8601, thì ToString ("o") sẽ mang lại những gì bạn đang tìm kiếm. Ví dụ,

2015-07-06T12:08:27

Tuy nhiên, DateTime + TimeZone có thể trình bày các vấn đề khác như được mô tả trong bài đăng trên blog DateTime và DateTime Offerset trong .NET: Thực tiễn tốt và những cạm bẫy phổ biến :

DateTime có vô số bẫy trong đó được thiết kế để cung cấp cho các lỗi mã của bạn:

1.- Giá trị DateTime với DateTimeKind.Unspecified là tin xấu.

2.- DateTime không quan tâm đến UTC / Local khi so sánh.

3.- Giá trị DateTime không biết chuỗi định dạng chuẩn.

4.- Phân tích một chuỗi có điểm đánh dấu UTC bằng DateTime không đảm bảo thời gian UTC.


2
ISO8601 được sử dụng trong strava cho một. Tuy nhiên, vui lòng sử dụng: StartTime.ToString ("yyyy-MM-ddTHH: mm: ssZ") thay vì ToString ("o") có thêm mili giây, v.v.
peterincumbria 13/03/2016

2
Đối với tôi, "yyyy-MM-dd-THH: mm: ssZ" theo nghĩa đen đã xuất ra chữ "Z" ở cuối chuỗi của tôi thay vì dấu mốc múi giờ, không làm được điều tôi muốn. ToString ("o") thực sự đã làm những gì tôi cần, dễ dàng hơn và ngắn hơn nhiều.
Blair Connolly

18

Ngạc nhiên vì không ai đề nghị nó:

System.DateTime.UtcNow.ToString("u").Replace(' ','T')
# Using PowerShell Core to demo

# Lowercase "u" format
[System.DateTime]::UtcNow.ToString("u")
> 2020-02-06 01:00:32Z

# Lowercase "u" format with replacement
[System.DateTime]::UtcNow.ToString("u").Replace(' ','T')
> 2020-02-06T01:00:32Z

Các UniversalSortableDateTimePattern giúp bạn gần như tất cả các cách để những gì bạn muốn (đó là hơn một RFC 3339 đại diện).


Đã thêm: Tôi đã quyết định sử dụng các điểm chuẩn trong câu trả lời https://stackoverflow.com/a/43793679/653058 để so sánh cách thức này thực hiện.

tl: dr; nó ở mức đắt đỏ nhưng vẫn chỉ hơn nửa phần nghìn giây trên chiếc máy tính xách tay cũ kỹ của tôi :-)

Thực hiện:

[Benchmark]
public string ReplaceU()
{
   var text = dateTime.ToUniversalTime().ToString("u").Replace(' ', 'T');
   return text;
}

Các kết quả:

// * Summary *

BenchmarkDotNet=v0.11.5, OS=Windows 10.0.19002
Intel Xeon CPU E3-1245 v3 3.40GHz, 1 CPU, 8 logical and 4 physical cores
.NET Core SDK=3.0.100
  [Host]     : .NET Core 3.0.0 (CoreCLR 4.700.19.46205, CoreFX 4.700.19.46214), 64bit RyuJIT
  DefaultJob : .NET Core 3.0.0 (CoreCLR 4.700.19.46205, CoreFX 4.700.19.46214), 64bit RyuJIT


|               Method |     Mean |     Error |    StdDev |
|--------------------- |---------:|----------:|----------:|
|           CustomDev1 | 562.4 ns | 11.135 ns | 10.936 ns |
|           CustomDev2 | 525.3 ns |  3.322 ns |  3.107 ns |
|     CustomDev2WithMS | 609.9 ns |  9.427 ns |  8.356 ns |
|              FormatO | 356.6 ns |  6.008 ns |  5.620 ns |
|              FormatS | 589.3 ns |  7.012 ns |  6.216 ns |
|       FormatS_Verify | 599.8 ns | 12.054 ns | 11.275 ns |
|        CustomFormatK | 549.3 ns |  4.911 ns |  4.594 ns |
| CustomFormatK_Verify | 539.9 ns |  2.917 ns |  2.436 ns |
|             ReplaceU | 615.5 ns | 12.313 ns | 11.517 ns |

// * Hints *
Outliers
  BenchmarkDateTimeFormat.CustomDev2WithMS: Default     -> 1 outlier  was  removed (668.16 ns)
  BenchmarkDateTimeFormat.FormatS: Default              -> 1 outlier  was  removed (621.28 ns)
  BenchmarkDateTimeFormat.CustomFormatK: Default        -> 1 outlier  was  detected (542.55 ns)
  BenchmarkDateTimeFormat.CustomFormatK_Verify: Default -> 2 outliers were removed (557.07 ns, 560.95 ns)

// * Legends *
  Mean   : Arithmetic mean of all measurements
  Error  : Half of 99.9% confidence interval
  StdDev : Standard deviation of all measurements
  1 ns   : 1 Nanosecond (0.000000001 sec)

// ***** BenchmarkRunner: End *****

1
Câu trả lời được chấp nhận của "o" không hoạt động, nhưng nó mang lại độ chính xác khó chịu (geez .XXXXXXX giây) trong khi tôi thích điều này vì nó dừng lại ở giây.
bắt đầu

Ngoài ra, doc tuyên bố "u" là ISO 8601, nhưng với không gian thay vì T thì sao? kết hợp với microsoft
jhocking

@jhocking en.wikipedia.org/wiki/ISO_8601#cite_note-30 ISO 8601 tương đối dễ dàng nếu bạn đọc qua nó ...
rburte

16

Tôi sẽ chỉ sử dụng XmlConvert:

XmlConvert.ToString(DateTime.UtcNow, XmlDateTimeSerializationMode.RoundtripKind);

Nó sẽ tự động bảo tồn múi giờ.


Tôi đã đi trước và thêm một phương pháp mở rộng. lớp tĩnh công khai DateTimeExtensions {chuỗi tĩnh công khai ToIsoFormat (DateTime dateTime này) {return XmlConvert.ToString (dateTime, XmlDateTimeSerializationMode.RoundtripKind); }}
muruge

14

Hầu hết các câu trả lời này có mili giây / micro giây mà rõ ràng không được ISO 8601 hỗ trợ. Câu trả lời đúng sẽ là:

System.DateTime.Now.ToString("yyyy-MM-ddTHH:mm:ssK");
// or
System.DateTime.Now.ToUniversalTime().ToString("yyyy-MM-ddTHH:mm:ssK");

Người giới thiệu:


15
Đọc liên kết Wikipedia của riêng bạn trong "Thời gian". Nó đề cập đến "phân số thập phân", có nghĩa là ISO 8601 hỗ trợ cả mili giây và micro giây (nhưng các bên giao tiếp có thể giới hạn số lượng vị trí thập phân được chấp nhận).
Søren Boisen

11
DateTime.Now.ToString("yyyy-MM-dd'T'HH:mm:ss zzz");

DateTime.Now.ToString("O");

LƯU Ý: Tùy thuộc vào chuyển đổi bạn đang thực hiện, bạn sẽ sử dụng dòng đầu tiên (giống như nó) hoặc dòng thứ hai.

Đảm bảo chỉ áp dụng định dạng vào giờ địa phương, vì "zzz" là thông tin múi giờ cho chuyển đổi UTC.

hình ảnh


Tôi không như vậy chắc chắn #ChrisHynes kể từ khi ông được hỏi về đề nghị tôi làm liên quan đến dòng đầu tiên của mã này, nhưng nếu bạn là chính xác và đó là trường hợp câu trả lời là "ReSharper"
PSM

9

Trình "s"xác định định dạng chuẩn biểu thị chuỗi định dạng ngày và giờ tùy chỉnh được xác định bởi thuộc tính DateTimeFormatInfo.SortableDateTimePotype . Mẫu phản ánh một tiêu chuẩn được xác định ( ISO 8601 ) và thuộc tính là chỉ đọc. Do đó, nó luôn giống nhau, bất kể văn hóa được sử dụng hoặc nhà cung cấp định dạng được cung cấp. Chuỗi định dạng tùy chỉnh là "yyyy'-'MM'-'dd'T'HH':'mm':'ss".

Khi trình xác định định dạng chuẩn này được sử dụng, hoạt động định dạng hoặc phân tích cú pháp luôn sử dụng văn hóa bất biến.

- từ MSDN


1
Vậy sử dụng được .ToString("s")không?
AhmetB - Google

Tôi cũng tin như thế. - Miễn là yêu cầu của bạn phù hợp với câu hỏi ban đầu đó là .. Nhưng hãy xem cảnh báo của simon wilson dưới đây
Amal

9

Để chuyển đổi DateTime.UtcNow thành biểu diễn chuỗi của yyyy-MM-ddTHH: mm: ssZ , bạn có thể sử dụng phương thức ToString () của cấu trúc DateTime với chuỗi định dạng tùy chỉnh. Khi sử dụng các chuỗi định dạng tùy chỉnh với DateTime, điều quan trọng cần nhớ là bạn cần thoát khỏi các phần tách biệt của mình bằng các dấu ngoặc đơn.

Sau đây sẽ trả về chuỗi phản hồi bạn muốn:

DateTime.UtcNow.ToString("yyyy'-'MM'-'dd'T'HH':'mm':'ss'Z'", DateTimeFormatInfo.InvariantInfo)

9

Điều thú vị là định dạng tùy chỉnh "yyyy-MM-ddTHH: mm: ssK" (không có ms) là phương thức định dạng nhanh nhất.

Ngoài ra, điều thú vị là định dạng "S" chậm trên Classic và nhanh trên Core ...

Tất nhiên các số rất gần nhau, giữa một số hàng khác nhau là không đáng kể (các thử nghiệm có hậu tố _Verifygiống như các số không có hậu tố đó, chứng tỏ độ lặp lại kết quả)

BenchmarkDotNet=v0.10.5, OS=Windows 10.0.14393
Processor=Intel Core i5-2500K CPU 3.30GHz (Sandy Bridge), ProcessorCount=4
Frequency=3233539 Hz, Resolution=309.2587 ns, Timer=TSC
  [Host] : Clr 4.0.30319.42000, 64bit RyuJIT-v4.6.1637.0
  Clr    : Clr 4.0.30319.42000, 64bit RyuJIT-v4.6.1637.0
  Core   : .NET Core 4.6.25009.03, 64bit RyuJIT


               Method |  Job | Runtime |       Mean |     Error |    StdDev |     Median |        Min |        Max | Rank |  Gen 0 | Allocated |
--------------------- |----- |-------- |-----------:|----------:|----------:|-----------:|-----------:|-----------:|-----:|-------:|----------:|
           CustomDev1 |  Clr |     Clr | 1,089.0 ns | 22.179 ns | 20.746 ns | 1,079.9 ns | 1,068.9 ns | 1,133.2 ns |    8 | 0.1086 |     424 B |
           CustomDev2 |  Clr |     Clr | 1,032.3 ns | 19.897 ns | 21.289 ns | 1,024.7 ns | 1,000.3 ns | 1,072.0 ns |    7 | 0.1165 |     424 B |
     CustomDev2WithMS |  Clr |     Clr | 1,168.2 ns | 16.543 ns | 15.474 ns | 1,168.5 ns | 1,149.3 ns | 1,189.2 ns |   10 | 0.1625 |     592 B |
              FormatO |  Clr |     Clr | 1,563.7 ns | 31.244 ns | 54.721 ns | 1,532.5 ns | 1,497.8 ns | 1,703.5 ns |   14 | 0.2897 |     976 B |
              FormatS |  Clr |     Clr | 1,243.5 ns | 24.615 ns | 31.130 ns | 1,229.3 ns | 1,200.6 ns | 1,324.2 ns |   13 | 0.2865 |     984 B |
       FormatS_Verify |  Clr |     Clr | 1,217.6 ns | 11.486 ns | 10.744 ns | 1,216.2 ns | 1,205.5 ns | 1,244.3 ns |   12 | 0.2885 |     984 B |
        CustomFormatK |  Clr |     Clr |   912.2 ns | 17.915 ns | 18.398 ns |   916.6 ns |   878.3 ns |   934.1 ns |    4 | 0.0629 |     240 B |
 CustomFormatK_Verify |  Clr |     Clr |   894.0 ns |  3.877 ns |  3.626 ns |   893.8 ns |   885.1 ns |   900.0 ns |    3 | 0.0636 |     240 B |
           CustomDev1 | Core |    Core |   989.1 ns | 12.550 ns | 11.739 ns |   983.8 ns |   976.8 ns | 1,015.5 ns |    6 | 0.1101 |     423 B |
           CustomDev2 | Core |    Core |   964.3 ns | 18.826 ns | 23.809 ns |   954.1 ns |   935.5 ns | 1,015.6 ns |    5 | 0.1267 |     423 B |
     CustomDev2WithMS | Core |    Core | 1,136.0 ns | 21.914 ns | 27.714 ns | 1,138.1 ns | 1,099.9 ns | 1,200.2 ns |    9 | 0.1752 |     590 B |
              FormatO | Core |    Core | 1,201.5 ns | 16.262 ns | 15.211 ns | 1,202.3 ns | 1,178.2 ns | 1,225.5 ns |   11 | 0.0656 |     271 B |
              FormatS | Core |    Core |   993.5 ns | 19.272 ns | 24.372 ns |   999.4 ns |   954.2 ns | 1,029.5 ns |    6 | 0.0633 |     279 B |
       FormatS_Verify | Core |    Core | 1,003.1 ns | 17.577 ns | 16.442 ns | 1,009.2 ns |   976.1 ns | 1,024.3 ns |    6 | 0.0674 |     279 B |
        CustomFormatK | Core |    Core |   878.2 ns | 17.017 ns | 20.898 ns |   877.7 ns |   851.4 ns |   928.1 ns |    2 | 0.0555 |     215 B |
 CustomFormatK_Verify | Core |    Core |   863.6 ns |  3.968 ns |  3.712 ns |   863.0 ns |   858.6 ns |   870.8 ns |    1 | 0.0550 |     215 B |

Mã số:

    public class BenchmarkDateTimeFormat
    {
        public static DateTime dateTime = DateTime.Now;

        [Benchmark]
        public string CustomDev1()
        {
            var d = dateTime.ToUniversalTime();
            var sb = new StringBuilder(20);

            sb.Append(d.Year).Append("-");
            if (d.Month <= 9)
                sb.Append("0");
            sb.Append(d.Month).Append("-");
            if (d.Day <= 9)
                sb.Append("0");
            sb.Append(d.Day).Append("T");
            if (d.Hour <= 9)
                sb.Append("0");
            sb.Append(d.Hour).Append(":");
            if (d.Minute <= 9)
                sb.Append("0");
            sb.Append(d.Minute).Append(":");
            if (d.Second <= 9)
                sb.Append("0");
            sb.Append(d.Second).Append("Z");
            var text = sb.ToString();
            return text;
        }

        [Benchmark]
        public string CustomDev2()
        {
            var u = dateTime.ToUniversalTime();
            var sb = new StringBuilder(20);
            var y = u.Year;
            var d = u.Day;
            var M = u.Month;
            var h = u.Hour;
            var m = u.Minute;
            var s = u.Second;
            sb.Append(y).Append("-");
            if (M <= 9)
                sb.Append("0");
            sb.Append(M).Append("-");
            if (d <= 9)
                sb.Append("0");
            sb.Append(d).Append("T");
            if (h <= 9)
                sb.Append("0");
            sb.Append(h).Append(":");
            if (m <= 9)
                sb.Append("0");
            sb.Append(m).Append(":");
            if (s <= 9)
                sb.Append("0");
            sb.Append(s).Append("Z");
            var text = sb.ToString();
            return text;
        }

        [Benchmark]
        public string CustomDev2WithMS()
        {
            var u  = dateTime.ToUniversalTime();
            var sb = new StringBuilder(23);
            var y  = u.Year;
            var d  = u.Day;
            var M  = u.Month;
            var h  = u.Hour;
            var m  = u.Minute;
            var s  = u.Second;
            var ms = u.Millisecond;
            sb.Append(y).Append("-");
            if (M <= 9)
                sb.Append("0");
            sb.Append(M).Append("-");
            if (d <= 9)
                sb.Append("0");
            sb.Append(d).Append("T");
            if (h <= 9)
                sb.Append("0");
            sb.Append(h).Append(":");
            if (m <= 9)
                sb.Append("0");
            sb.Append(m).Append(":");
            if (s <= 9)
                sb.Append("0");
            sb.Append(s).Append(".");
            sb.Append(ms).Append("Z");
            var text = sb.ToString();
            return text;
        }
        [Benchmark]
        public string FormatO()
        {
            var text = dateTime.ToUniversalTime().ToString("o");
            return text;
        }
        [Benchmark]
        public string FormatS()
        {
            var text = string.Concat(dateTime.ToUniversalTime().ToString("s"),"Z");
            return text;
        }

        [Benchmark]
        public string FormatS_Verify()
        {
            var text = string.Concat(dateTime.ToUniversalTime().ToString("s"), "Z");
            return text;
        }

        [Benchmark]
        public string CustomFormatK()
        {
            var text = dateTime.ToUniversalTime().ToString("yyyy-MM-ddTHH:mm:ssK");
            return text;
        }

        [Benchmark]
        public string CustomFormatK_Verify()
        {
            var text = dateTime.ToUniversalTime().ToString("yyyy-MM-ddTHH:mm:ssK");
            return text;
        }
    }

https://github.com/dotnet/BenchmarkDotNet đã được sử dụng



2

Nếu bạn đang phát triển theo SharePoint 2010 trở lên, bạn có thể sử dụng

using Microsoft.SharePoint;
using Microsoft.SharePoint.Utilities;
...
string strISODate = SPUtility.CreateISO8601DateTimeFromSystemDateTime(DateTime.Now)

20
SharePoint, khi .Net của bạn không đủ Java.
Henrik

18
Sử dụng SharePoint cho việc này giống như mang một bồn thạch, hộp diêm ướt và 2 con tinh tinh đi theo hình thang đến một cuộc đấu súng.
nathanchere

Ngay cả trong SharePoint cũng hy vọng bạn có thể sử dụng BCL .ToString("o")hoặc, tốt hơn , $"My complicated string {dt:o}".
binki

2

Để định dạng như 2018-06-22T13: 04: 16 có thể được thông qua trong URI của một API sử dụng:

public static string FormatDateTime(DateTime dateTime)
{
    return dateTime.ToString("s", System.Globalization.CultureInfo.InvariantCulture);
}

1
Tôi nghĩ chuỗi ngày ISO này là bất biến văn hóa theo định nghĩa.
Jonas

1

Như đã đề cập trong câu trả lời khác, DateTimecó vấn đề theo thiết kế.

Thời gian

Tôi đề nghị sử dụng NodaTime để quản lý giá trị ngày / giờ:

  • Giờ địa phương, ngày, giờ
  • Giờ toàn cầu
  • Thời gian với múi giờ
  • Giai đoạn = Stage
  • Thời lượng

Định dạng

Vì vậy, để tạo và định dạng, ZonedDateTimebạn có thể sử dụng đoạn mã sau:

var instant1 = Instant.FromUtc(2020, 06, 29, 10, 15, 22);

var utcZonedDateTime = new ZonedDateTime(instant1, DateTimeZone.Utc);
utcZonedDateTime.ToString("yyyy-MM-ddTHH:mm:ss'Z'", CultureInfo.InvariantCulture);
// 2020-06-29T10:15:22Z


var instant2 = Instant.FromDateTimeUtc(new DateTime(2020, 06, 29, 10, 15, 22, DateTimeKind.Utc));

var amsterdamZonedDateTime = new ZonedDateTime(instant2, DateTimeZoneProviders.Tzdb["Europe/Amsterdam"]);
amsterdamZonedDateTime.ToString("yyyy-MM-ddTHH:mm:ss'Z'", CultureInfo.InvariantCulture);
// 2020-06-29T12:15:22Z

Đối với tôi NodaTimemã trông khá dài dòng. Nhưng các loại thực sự hữu ích. Chúng giúp xử lý các giá trị ngày / thời gian chính xác.

Newtonsoft.Json

Để sử dụng NodaTimevới Newtonsoft.Jsonbạn cần thêm tham chiếu đến NodaTime.Serialization.JsonNetgói NuGet và định cấu hình các tùy chọn JSON.

services
    .AddMvc()
    .AddJsonOptions(options =>
    {
        var settings=options.SerializerSettings;
        settings.DateParseHandling = DateParseHandling.None;
        settings.ConfigureForNodaTime(DateTimeZoneProviders.Tzdb);
    });
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.