Работа с датами только по дате в часовых поясах в .Net
Вопрос
Хорошо, немного глотка.Итак, проблема у меня в следующем: мне нужно сохранить дату истечения срока действия, где только требуется часть даты, и мне не нужно преобразование часового пояса.Так, например, если у меня установлен срок действия «08 марта 2008 г.», я хочу, чтобы это значение было возвращено любому клиенту - независимо от его часового пояса.Проблема с удалением его в качестве DateTime заключается в том, что он хранится/отправляется как «8 марта 2008 г. 00:00», что означает, что для клиентов, подключающихся из любого часового к западу от меня, и, следовательно, переворачивается в «07 марта 2008 г.» любые предложения Для чистого обработки этого сценария?Очевидно, что отправка его в виде строки будет работать.что-нибудь еще ?Спасибо, Ян
Решение
Вы можете создать структуру Date, которая обеспечивает доступ к нужным/нужным деталям, например:
public struct Date
{
public int Month; //or string instead of int
public int Day;
public int Year;
}
Это легкий, гибкий и дает вам полный контроль.
Другие советы
Я не уверен, о какой технологии удаленного взаимодействия вы имеете в виду, но это реальная проблема с WCF, который в настоящее время поддерживает сериализацию DateTime только как xs:DateTime, что не подходит для значения только даты, когда вас не интересуют часовые пояса.
В .NET 3.5 представлен новый тип DateTimeOffset, который удобен для передачи DateTime между часовыми поясами, но не помогает в сценарии, использующем только дату.
В идеале WCF необходимо дополнительно поддерживать xs:Date для сериализации дат, как это требуется здесь:
http://connect.microsoft.com/wcf/feedback/ViewFeedback.aspx?FeedbackID=349215
Я делаю это так:Всякий раз, когда у меня есть дата в памяти или в файле, она всегда находится в формате DateTime в формате UTC.Когда я показываю дату пользователю, это всегда строка.Когда я конвертирую строку в DateTime, я также выполняю преобразование часового пояса.
Таким образом, мне никогда не придется иметь дело с часовыми поясами в моей логике, только в презентации.
Вы можете отправить его как время UTC.
dateTime1.ToUniversalTime()
Я думаю, что отправка в виде строки временной метки будет самым быстрым/простым способом, хотя вы можете посмотреть, как заставить локаль остановить преобразование времени.
Самый простой способ справиться с этим в приложениях в прошлом — просто сохранить дату в виде строки в формате гггг-мм-дд.Он однозначен и ничем автоматически не переводится.
Да, это боль...
Почему бы вам не отправить его в виде строки, а затем при необходимости преобразовать обратно в тип даты?Таким образом, он не будет конвертироваться в разные часовые пояса.Будь проще.
Редактировать:Мне нравится идея Struct, она обеспечивает хорошую функциональность.