Я храню все свои даты в формате UTC в моей базе данных. Я спрашиваю пользователя о его часовом поясе, и я хочу использовать его часовой пояс, а также предполагаю, что серверное время определяет 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);
Редактировать 2 @ Джон Скит
Да, я просто думал о том, что мне, возможно, даже не нужно делать все это. Времена меня смущают, поэтому пост может быть не таким ясным, как следовало бы. Я никогда не знаю, какого черта DateTime.Now получает (я пытался изменить свой часовой пояс на другой, и он продолжал получать мое местное время).
Это то, что я хотел, чтобы мои вещи делали. Пользователь заходит на сайт, добавляет какое-то предупреждение, и теперь он сохраняется как utc (раньше это было DateTime. Теперь кто-то предложил хранить все в формате UTC).
Итак, до того, как пользователь зашел на мой сайт и, в зависимости от того, где был мой хостинг-сервер, он мог быть таким на следующий день. Поэтому, если говорят, что предупреждение показывается 30-го августа (их время), но с разницей во времени сервера они могут прийти 29-го августа, и предупреждение будет показано.
Так что я хотел с этим бороться. Так что теперь я не уверен, стоит ли мне просто хранить их местное время, а затем использовать это смещение? Или просто хранить время UTC. Простое сохранение времени UTC все еще может быть неправильным, поскольку пользователь, вероятно, будет думать по местному времени, и я не уверен, как на самом деле работает UTC, это все равно может привести к разнице во времени.
Edit3
var info = TimeZoneInfo.FindSystemTimeZoneById(id)
DateTimeOffset usersTime = TimeZoneInfo.ConvertTime(DataBaseUTCDate,
TimeZoneInfo.Utc, info);