DateTime을 웹 UTC 형식으로 어떻게 포맷 할 수 있습니까?


89

" 2009-09-01T00:00:00.000Z" 형식을 지정하려는 DateTime이 있지만 다음 코드는 " 2009-09-01T00:00:00.000+01:00"(두 줄 모두)를 제공합니다.

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")

작동하는 방법에 대한 아이디어가 있습니까?

답변:


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

1
@Downvoter :이 답변에 대해 무엇이 잘못되었다고 생각하십니까?
LukeH

12
이것은 작동했지만 .ToUniversalTime ()은 이미 UTC에 있지만 yourDateTime 변수가 지정하지 않으면 기존 날짜를 엉망으로 만듭니다. 결국 .ToUniversalTime ()을 제거하고 날짜는 양쪽 끝 (데이터베이스 및 웹 클라이언트)에서 예상했던 것과 일치했습니다.
Robin Vessey

10
날짜 시간이 이미 표준시 인 경우 .ToUniversalTime()원하는 모든 것을 호출 할 수 있지만 변경되지는 않습니다. -그러나 현지 시간으로 저장된 표준 시간 값이있는 경우 당연히 변경됩니다 (그러나이 경우 처리해야 할 더 큰 문제가 있습니다!)-어쨌든,이 대답은 다음과 같습니다. 무서운. "O"대신 아래 답변에 지정된 형식 문자열을 사용해야합니다 .
BrainSlugs83

1
@ BrainSlugs83 :이 "끔찍한"대답은 실제로 OP가 요청한 내용을 제공합니다 2009-09-01T00:00:00.000Z.. "O"지정자를 사용하면 2009-09-01T00:00:00.0000000Z.
LukeH


75

왕복 ( "O", "o") 형식 지정자를 사용하지 않습니까?

"O"또는 "o"표준 형식 지정자는 표준 시간대 정보를 보존하고 ISO 8601을 준수하는 결과 문자열을 내보내는 패턴을 사용하는 사용자 지정 날짜 및 시간 형식 문자열을 나타냅니다. DateTime 값의 경우이 형식 지정자는 날짜를 보존하도록 설계되었습니다. 텍스트의 DateTime.Kind 속성과 함께 시간 값. 스타일 매개 변수가 DateTimeStyles.RoundtripKind로 설정된 경우 DateTime.Parse (String, IFormatProvider, DateTimeStyles) 또는 DateTime.ParseExact 메서드를 사용하여 서식이 지정된 문자열을 다시 구문 분석 할 수 있습니다.

"O"또는 "o"표준 형식 지정자는 DateTime 값에 대한 "yyyy '-'MM '-'dd'T'HH ':'mm ':'ss '.'fffffffK"사용자 지정 형식 문자열에 해당합니다. DateTimeOffset 값에 대한 "yyyy '-'MM '-'dd'T'HH ':'mm ':'ss '.'fffffffzzz"사용자 정의 형식 문자열입니다. 이 문자열에서 하이픈, 콜론 및 문자 "T"와 같이 개별 문자를 구분하는 작은 따옴표 쌍은 개별 문자가 변경할 수없는 리터럴임을 나타냅니다. 아포스트로피는 출력 문자열에 나타나지 않습니다.

O "또는"o "표준 형식 지정자 (및"yyyy '-'MM '-'dd'T'HH ':'mm ':'ss '.'fffffffK "사용자 지정 형식 문자열)는 세 가지 방법을 활용합니다. ISO 8601은 DateTime 값의 Kind 속성을 유지하기위한 표준 시간대 정보를 나타냅니다.

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

요청한대로 작동하지 않기 때문에 결국 "yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'fffffffzzz" Zulu 형식이 아닙니다.
astrowalker 2019

@astrowalker 작동합니다. 그는 대답에서 여러 가지 옵션을 제공했습니다. 하나만 선택하면됩니다. 귀하의 경우 (및 OP에서) DateTimeKind.Utc를 사용하여 끝에 "z"가있는 문자열을 생성합니다 (일명 "Zulu 형식"또는 "UTC 시간"). UTC에 대한 그의 예제 출력을보십시오. 제 경우에는 다음 dtVariable.ToUniversalTime().ToString("o")을 사용했습니다. "2019-05-26T19:50:34.4400000Z"또는 로 변환됩니다 "yyyy-MM-ddTHH:mm:ss.fffffffZ". 참고 : Javscript의 new Date(dtDateString).getTime()방법으로 이것을 테스트 했으며 이것에 의해 생성 된 날짜 문자열을 올바르게 구문 분석했습니다.
MikeTeeVee

@MikeTeeVee, 제공된 솔루션이 작동하지 않는다는 점을 지적했습니다 (DTO의 경우). 적절한 방법은 dto.ToUniversalTime().ToString("yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'FFFFFFF'Z'")입니다. 레코드의 경우 "o"오프셋 만 추가하면 Zulu 형식이 아닙니다.
astrowalker

1
문자열 변환을 시도하는 사람들을 위해 :$"{DateTime.UtcNow:O}"
Tiago César Oliveira

18
string.Format("{0:yyyy-MM-ddTHH:mm:ss.FFFZ}", DateTime.UtcNow)

2017-02-10T08 : 12 : 39.483Z를 반환합니다.


6

사용하기에 가장 좋은 형식은 "yyyy '-'MM '-'dd'T'HH ':'mm ':'ss '.'fffK"입니다.

문자열의 마지막 K는 날짜가 UTC 인 경우 'Z'로 변경되고 로컬 인 경우 시간대 (+ -hh : mm)로 변경됩니다. ( http://msdn.microsoft.com/en-us/library/8kb3ddd4.aspx )

LukeH가 말했듯이 모든 날짜가 UTC가되도록하려면 ToUniversalTime을 사용하는 것이 좋습니다.

최종 코드는 다음과 같습니다.

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

6

일부 사람들은 'ToUniversalTime'이 의도하지 않은 잘못된 시간 표시를 유발할 수 있다는 점에서 다소 안전하지 않다고 지적했습니다. 이를 확장하여 솔루션의 더 자세한 예를 제공합니다. 여기에있는 샘플은 원하는대로 ToString을 사용할 수있는 UTC DateTime을 안전하게 반환하는 DateTime 개체에 대한 확장을 만듭니다.

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();
    }
}

5

DateTimeOffset 클래스 를 사용하려고합니다 .

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

밀리 초 단위로 원래 형식을 놓쳐서 죄송합니다

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

5

이 코드는 저에게 효과적입니다.

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);

-3

이 시도:

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

이전에 질문 한 질문


3
나는 그것을 (아직) 파싱하려고하지 않고 그것을 인쇄하려고합니다.
Grzenio
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.