Возникли проблемы с преобразованием моего DateTime в UTC

Я храню все мои даты в формате 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);

Ответы на вопрос(5)

Ваш ответ на вопрос