program story

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

inputbox 2020. 10. 11. 10:33
반응형

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


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

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


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

왕복 ( "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

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

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


사용하기에 가장 좋은 형식은 "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");

일부 사람들은 '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();
    }
}

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

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

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

이 시도:

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

이전에 질문 한 질문

참고 URL : https://stackoverflow.com/questions/1820915/how-can-i-format-datetime-to-web-utc-format

반응형