Я сохраняю все свои даты в формате UTC в моей базе данных. Я спрашиваю у пользователя их часовой пояс, и я хочу использовать их часовой пояс, а также то, что я предполагаю, это время сервера, чтобы определить для них UTC.Проблемы с преобразованием даты DateTime в UTC
Как только у меня есть это, я хочу выполнить поиск, чтобы узнать, что такое диапазон в базе данных, используя их новую дату UTC.
но я всегда получаю это исключение.
System.ArgumentException was unhandled by user code
Message="The conversion could not be completed because the
supplied DateTime did not have the Kind property set correctly.
For example, when the Kind property is DateTimeKind.Local,
the source time zone must be TimeZoneInfo.Local.
Parameter name: sourceTimeZone"
Я не знаю, почему я получаю это.
Я попробовал 2 способа
TimeZoneInfo zone = TimeZoneInfo.FindSystemTimeZoneById(id);
// I also tried DateTime.UtcNow
DateTime now = DateTime.SpecifyKind(DateTime.Now, DateTimeKind.Local);
var utc = TimeZoneInfo.ConvertTimeToUtc(now , zone);
Это не удалось, так что я устал
DateTime now = DateTime.SpecifyKind(DateTime.Now, DateTimeKind.Local);
var utc = TimeZoneInfo.ConvertTimeBySystemTimeZoneId(now,
ZoneId, TimeZoneInfo.Utc.Id);
Это также не как с той же ошибкой. Что я делаю не так?
Редактировать эту работу?
DateTime localServerTime = DateTime.SpecifyKind(DateTime.Now, DateTimeKind.Local);
TimeZoneInfo info = TimeZoneInfo.FindSystemTimeZoneById(id);
var usersTime = TimeZoneInfo.ConvertTime(localServerTime, info);
var utc = TimeZoneInfo.ConvertTimeToUtc(usersTime, userInfo);
Edit 2 @ Jon тарелочкам
Я. Я просто думал о том, что я не мог бы даже не нужно делать все это. Время вещи меня смущает, поэтому сообщение может быть не таким ясным, как должно быть. Я никогда не знаю, что делает heck DateTime.Now (я пытался изменить свой часовой пояс на другой часовой пояс, и он продолжал получать мое местное время).
Это то, что я хотел, чтобы мои вещи делали. Пользователь приходит на сайт, добавляет некоторое предупреждение, и теперь он сохраняется как utc (до того, как он был DateTime.Now, тогда кто-то предложил хранить все UTC).
Итак, перед тем, как пользователь придет на мой сайт и в зависимости от того, где мой сервер хостинга мог бы быть на следующий день. Поэтому, если предупреждение было объявлено 30 августа (их время), но с разницей во времени сервера они могут появиться 29 августа, и будет показано предупреждение.
Так что я хотел бороться с этим. Итак, теперь я не уверен, должен ли я просто хранить свое местное время, а затем использовать этот материал смещения? Или просто сохраните время UTC. С сохранением времени UTC все еще может быть неправильно, поскольку пользователь все еще, вероятно, будет думать в местном масштабе, и я не уверен, что UTC действительно работает, он все равно может закончиться разницей времени.
Edit3
var info = TimeZoneInfo.FindSystemTimeZoneById(id)
DateTimeOffset usersTime = TimeZoneInfo.ConvertTime(DataBaseUTCDate,
TimeZoneInfo.Utc, info);
'DateTime.Now.Kind' уже' Local'; вам не нужно называть 'SpecifyKind'. – SLaks
@Edit 2: сохранить оповещения в формате UTC и показать их в часовом поясе, предоставленном пользователем, как показано в моем ответе. – dtb
Так как это будет работать? Я получаю DateTime.UtcNow, а затем фильтрует предупреждения из db? затем преобразовать найденные результаты в их местное время? – chobo2