Ответ 1
Я планировал преобразовать эти времена в UTC/Noda Instants, чтобы предотвратить необходимость хранить всю информацию о часовом поясе с каждой датой в базе данных.
Это хорошо, если позже вам не нужно знать оригинальный часовой пояс. (например, если пользователь изменяет часовой пояс, но все еще хочет что-то повторяющееся в исходном часовом поясе).
В любом случае, я разделил бы это на три этапа:
- Разбор в
LocalDateTime
- Преобразование этого в
ZonedDateTime
- Преобразование этого в
Instant
Что-то вроде:
// TODO: Are you sure it *will* be in the invariant culture? No funky date
// separators?
// Note that if all users have the same pattern, you can make this a private
// static readonly field somewhere
var pattern = LocalDateTimePattern.CreateWithInvariantCulture("yyyy/MM/dd HH:mm");
var parseResult = pattern.Parse(userSubmittedDateTimeString);
if (!parseResult.Success)
{
// throw an exception or whatever you want to do
}
var localDateTime = parseResult.Value;
var timeZone = DateTimeZoneProviders.Tzdb[userTimeZone];
// TODO: Consider how you want to handle ambiguous or "skipped" local date/time
// values. For example, you might want InZoneStrictly, or provide your own custom
// handler to InZone.
var zonedDateTime = localDateTime.InZoneLeniently(timeZone);
var instant = zonedDateTime.ToInstant();