Примечание.
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
Во многих приложениях значение даты и времени предназначено для однозначной идентификации одной точки во времени. В этой статье показано, как сохранить и восстановить DateTime значение, DateTimeOffset значение и значение даты и времени со сведениями часового пояса, чтобы восстановленное значение идентифицировали то же время, что и сохраненное значение.
Обратное преобразование значения DateTime
Преобразуйте значение DateTime в строковое представление, вызвав метод DateTime.ToString(String) с описателем формата "o".
Сохраните строковое представление DateTime значения в файл или передайте его через процесс, домен приложения или границу компьютера.
Получите строку, представляющую значение DateTime.
DateTime.Parse(String, IFormatProvider, DateTimeStyles) Вызовите метод и передайте DateTimeStyles.RoundtripKind значение
stylesпараметра.
В следующем примере показано, как обойти 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 {dateToSave.ToString()} ({dateToSave.Kind.ToString()}) to {dateString}.");
outFile.WriteLine(dateString);
Console.WriteLine($"Wrote {dateString} to {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 {restoredDate.ToString()} ({restoredDate.Kind.ToString()}) from {fileName}.");
}
// 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 часа позже, чем первоначальное время, что отражает разницу во времени между двумя часовыми поясами. Однако этот метод не обязательно точен для неопределенного времени. Все DateTime значения, свойство Kind которых Unspecified, рассматриваются как локальные времена. Если это не локальное время, DateTime он не успешно определяет правильный момент времени. Обходной путь для этого ограничения заключается в тесной привязке значения даты и времени с часовыми поясами для операции сохранения и восстановления.
Двустороннее преобразование значения DateTimeOffset
DateTimeOffset Преобразуйте значение в его строковое представление, вызвав метод DateTimeOffset.ToString(String) с описателем формата "o".
Сохраните строковое представление DateTimeOffset значения в файл или передайте его через процесс, домен приложения или границу компьютера.
Получите строку, представляющую значение DateTimeOffset.
DateTimeOffset.Parse(String, IFormatProvider, DateTimeStyles) Вызовите метод и передайте DateTimeStyles.RoundtripKind значение
stylesпараметра.
В следующем примере показано, как выполнить обратное преобразование значения 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 {dateToSave.ToString()} to {dateString}.");
outFile.WriteLine(dateString);
Console.WriteLine($"Wrote {dateString} to {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 {restoredDateOff.ToString()} from {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 значение как одну точку во времени. Затем значение можно преобразовать в координированное универсальное время (UTC), вызвав метод DateTimeOffset.ToUniversalTime, или в время в определенном часовом поясе, вызвав метод DateTimeOffset.ToOffset или TimeZoneInfo.ConvertTime(DateTimeOffset, TimeZoneInfo). Основным ограничением этого метода является то, что арифметика даты и времени при выполнении DateTimeOffset значения, представляющего время в определенном часовом поясе, может не производить точные результаты для этого часового пояса. Это связано с тем, что при инстанцировании DateTimeOffset оно теряет связь с часовым поясом. Поэтому правила корректировки часового пояса больше не могут применяться при выполнении вычислений даты и времени. Эту проблему можно обойти, определив настраиваемый тип, включающий как значение даты, так и времени, а также сопутствующий часовой пояс.
Компиляция кода
В этих примерах требуется импортировать следующие пространства имен, используя директивы C# using или операторы Visual Basic Imports.
- System (только C#)
- System.Globalization
- System.IO