Подтвердить что ты не робот

Начало работы с Noda Time

Я хочу использовать время Noda для довольно простого приложения, однако я изо всех сил стараюсь найти любую документацию для обработки очень простого варианта использования:

У меня есть зарегистрированный пользователь и будет хранить их предпочтительный часовой пояс в настройках. Любая дата/время, которое приходит от клиента, поступает в известном текстовом формате (например, "dd/MM/yyyy HH: mm" ), с известным идентификатором часового пояса (например, "Европа/Лондон" ). Я планировал преобразовать эти времена в UTC/Noda Instants, чтобы предотвратить необходимость хранить информацию о часовом поясе с каждой датой в базе данных.

Во-первых, звучит ли это как разумный подход? Я свободен в значительной степени изменить что угодно, поэтому был бы счастлив, если бы был настроен на лучший/более разумный курс. База данных - MongoDb, используя драйвер С#.

То, что я пробовал, идет по этим строкам, но изо всех сил пытается преодолеть первый шаг!

var userSubmittedDateTimeString = "2013/05/09 10:45";
var userFormat = "yyyy/MM/dd HH:mm";
var userTimeZone = "Europe/London";

//noda code here to convert to UTC


//Then back again:

Я знаю, что кто-то спросит "что ты пробовал", для которого у меня есть разные неудачные конверсии. Рад отметить страницу "Начало работы с нодой"!

4b9b3361

Ответ 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();