방법: 날짜 및 시간 값 라운드트립

많은 애플리케이션에서 날짜 및 시간 값은 단일 시점을 명확하게 식별하는 데 사용됩니다. 이 문서에서는 복원된 값이 저장된 값과 같은 시간을 식별할 수 있도록 DateTime 값, DateTimeOffset 값 그리고 표준 시간대 정보가 있는 날짜 및 시간 값을 저장하고 복원하는 방법을 보여 줍니다.

DateTime 값 왕복

  1. “o” 형식 지정자와 함께 DateTime.ToString(String) 메서드를 호출하여 DateTime 값을 해당 문자열 표현으로 변환합니다.

  2. DateTime 값의 문자열 표현을 파일에 저장하거나 프로세스, 애플리케이션 도메인 또는 컴퓨터 경계를 넘어 전달합니다.

  3. DateTime 값을 나타내는 문자열을 검색합니다.

  4. DateTime.Parse(String, IFormatProvider, DateTimeStyles) 메서드를 호출하고 styles 매개 변수의 값으로 DateTimeStyles.RoundtripKind를 전달합니다.

다음 예제는 DateTime 값을 라운드트립하는 방법을 보여줍니다.

const string fileName = @".\DateFile.txt";

StreamWriter outFile = new StreamWriter(fileName);

// Save DateTime value.
DateTime dateToSave = DateTime.SpecifyKind(new DateTime(2008, 6, 12, 18, 45, 15),
                                           DateTimeKind.Local);
string? dateString = dateToSave.ToString("o");
Console.WriteLine("Converted {0} ({1}) to {2}.",
                  dateToSave.ToString(),
                  dateToSave.Kind.ToString(),
                  dateString);
outFile.WriteLine(dateString);
Console.WriteLine("Wrote {0} to {1}.", dateString, fileName);
outFile.Close();

// Restore DateTime value.
DateTime restoredDate;

using StreamReader inFile = new StreamReader(fileName);
dateString = inFile.ReadLine();

if (dateString is not null)
{
    restoredDate = DateTime.Parse(dateString, null, DateTimeStyles.RoundtripKind);
    Console.WriteLine("Read {0} ({2}) from {1}.", restoredDate.ToString(),
                                                  fileName,
                                                  restoredDate.Kind.ToString());
}

// The example displays the following output:
//    Converted 6/12/2008 6:45:15 PM (Local) to 2008-06-12T18:45:15.0000000-05:00.
//    Wrote 2008-06-12T18:45:15.0000000-05:00 to .\DateFile.txt.
//    Read 6/12/2008 6:45:15 PM (Local) from .\DateFile.txt.
Const fileName As String = ".\DateFile.txt"

Dim outFile As New StreamWriter(fileName)

' Save DateTime value.
Dim dateToSave As Date = DateTime.SpecifyKind(#06/12/2008 6:45:15 PM#, _
                                              DateTimeKind.Local)
Dim dateString As String = dateToSave.ToString("o")
Console.WriteLine("Converted {0} ({1}) to {2}.", dateToSave.ToString(), _
                  dateToSave.Kind.ToString(), dateString)
outFile.WriteLine(dateString)
Console.WriteLine("Wrote {0} to {1}.", dateString, fileName)
outFile.Close()

' Restore DateTime value.
Dim restoredDate As Date

Dim inFile As New StreamReader(fileName)
dateString = inFile.ReadLine()
inFile.Close()
restoredDate = DateTime.Parse(dateString, Nothing, DateTimeStyles.RoundTripKind)
Console.WriteLine("Read {0} ({2}) from {1}.", restoredDate.ToString(), _
                  fileName, restoredDAte.Kind.ToString())
' The example displays the following output:
'    Converted 6/12/2008 6:45:15 PM (Local) to 2008-06-12T18:45:15.0000000-05:00.
'    Wrote 2008-06-12T18:45:15.0000000-05:00 to .\DateFile.txt.
'    Read 6/12/2008 6:45:15 PM (Local) from .\DateFile.txt.

DateTime 값을 라운드트립할 경우 이 기술은 모든 현지 시간 및 세계시에 대한 시간을 성공적으로 유지합니다. 예를 들어, 로컬 DateTime 값이 미국 태평양 표준 시간대의 시스템에 저장되고, 미국 중앙 표준 시간대의 시스템에서 복원되면, 두 표준 시간대 간의 차이를 반영하여 복원된 날짜 및 시간은 원래 시간보다 2시간 늦은 시간으로 나타납니다. 그러나 이 기술은 지정되지 않은 시간에 대해 반드시 정확하지는 않습니다. Kind 속성이 Unspecified인 모든 DateTime 값은 로컬 시간인 것처럼 취급됩니다. 로컬 시간이 아닌 경우 DateTime은 올바른 시점을 성공적으로 식별하지 못합니다. 이 제한에 대한 해결책은 저장 및 복원 작업의 표준 시간대와 날짜 및 시간 값을 밀접하게 연결하는 것입니다.

DateTimeOffset 값 왕복

  1. “o” 형식 지정자와 함께 DateTimeOffset.ToString(String) 메서드를 호출하여 DateTimeOffset 값을 해당 문자열 표현으로 변환합니다.

  2. DateTimeOffset 값의 문자열 표현을 파일에 저장하거나 프로세스, 애플리케이션 도메인 또는 컴퓨터 경계를 넘어 전달합니다.

  3. DateTimeOffset 값을 나타내는 문자열을 검색합니다.

  4. DateTimeOffset.Parse(String, IFormatProvider, DateTimeStyles) 메서드를 호출하고 styles 매개 변수의 값으로 DateTimeStyles.RoundtripKind를 전달합니다.

다음 예제는 DateTimeOffset 값을 라운드트립하는 방법을 보여줍니다.

const string fileName = @".\DateOff.txt";

StreamWriter outFile = new StreamWriter(fileName);

// Save DateTime value.
DateTimeOffset dateToSave = new DateTimeOffset(2008, 6, 12, 18, 45, 15,
                                               new TimeSpan(7, 0, 0));
string? dateString = dateToSave.ToString("o");
Console.WriteLine("Converted {0} to {1}.", dateToSave.ToString(),
                  dateString);
outFile.WriteLine(dateString);
Console.WriteLine("Wrote {0} to {1}.", dateString, fileName);
outFile.Close();

// Restore DateTime value.
DateTimeOffset restoredDateOff;

using StreamReader inFile = new StreamReader(fileName);
dateString = inFile.ReadLine();

if (dateString is not null)
{
    restoredDateOff = DateTimeOffset.Parse(dateString, null,
                                           DateTimeStyles.RoundtripKind);
    Console.WriteLine("Read {0} from {1}.", restoredDateOff.ToString(), fileName);
}

// The example displays the following output:
//    Converted 6/12/2008 6:45:15 PM +07:00 to 2008-06-12T18:45:15.0000000+07:00.
//    Wrote 2008-06-12T18:45:15.0000000+07:00 to .\DateOff.txt.
//    Read 6/12/2008 6:45:15 PM +07:00 from .\DateOff.txt.
Const fileName As String = ".\DateOff.txt"

Dim outFile As New StreamWriter(fileName)

' Save DateTime value.
Dim dateToSave As New DateTimeOffset(2008, 6, 12, 18, 45, 15, _
                                     New TimeSpan(7, 0, 0))
Dim dateString As String = dateToSave.ToString("o")
Console.WriteLine("Converted {0} to {1}.", dateToSave.ToString(), dateString)
outFile.WriteLine(dateString)
Console.WriteLine("Wrote {0} to {1}.", dateString, fileName)
outFile.Close()

' Restore DateTime value.
Dim restoredDateOff As DateTimeOffset

Dim inFile As New StreamReader(fileName)
dateString = inFile.ReadLine()
inFile.Close()
restoredDateOff = DateTimeOffset.Parse(dateString, Nothing, DateTimeStyles.RoundTripKind)
Console.WriteLine("Read {0} from {1}.", restoredDateOff.ToString(), fileName)
' The example displays the following output:
'    Converted 6/12/2008 6:45:15 PM +07:00 to 2008-06-12T18:45:15.0000000+07:00.
'    Wrote 2008-06-12T18:45:15.0000000+07:00 to .\DateOff.txt.
'    Read 6/12/2008 6:45:15 PM +07:00 from .\DateOff.txt.

이 기술은 DateTimeOffset 값을 항상 단일 시점으로 명확하게 식별합니다. 그런 다음, DateTimeOffset.ToUniversalTime 메서드를 호출하여 값을 UTC(협정 세계시)로 변환하거나 DateTimeOffset.ToOffset 또는 TimeZoneInfo.ConvertTime(DateTimeOffset, TimeZoneInfo) 메서드를 호출하여 값을 특정 표준 시간대의 시간으로 변환할 수 있습니다. 이 기술의 주요 제한은 특정 표준 시간대의 시간을 나타내는 DateTimeOffset 값에 대해 날짜 및 시간 연산을 수행하면 해당 표준 시간대에 대해 정확한 결과를 얻을 수 없다는 것입니다. 이는 DateTimeOffset 값이 인스턴스화될 때 해당 표준 시간대에서 분리되기 때문입니다. 따라서 날짜 및 시간 계산을 수행할 경우에 해당 표준 시간대의 조정 규칙은 더 이상 적용될 수 없습니다. 날짜 및 시간 값과 동반되는 표준 시간대를 포함하는 사용자 지정 형식을 정의하여 이 문제를 해결할 수 있습니다.

코드 컴파일

이러한 예제에서는 C# using 지시문 또는 Visual Basic Imports 문을 사용하여 다음 네임스페이스를 가져와야 합니다.

참고 항목