Должен ли я использовать DateTime.Now или DateTime.UtcNow в HttpCookie.Expires и HttpCachePolicy.SetExpires?

Должен ли я использовать DateTime.Now или DateTime.UtcNow в HttpCookie.Expires и HttpCachePolicy.SetExpires?

Файлы cookie отправляют время 'GMT', но я не знаю, что произойдет, если Я отправляю DateTime.Now.AddDays(3), если буду в GMT + 5. То же самое с Expires HTTP header (sec 14.21).

Что мне использовать?


person vtortola    schedule 31.01.2011    source источник


Ответы (2)


В данном случае это не имеет значения.

На внутреннем уровне первое, что делает .SetExpires, - это конвертирует предоставленное вами datetime в UTC, прежде чем устанавливать его в cookie.

Имейте в виду, что если ваш потребитель datetime правильно использует класс DateTime, то оба они одинаковы - просто один "привязан" к UTC, а другой нет:

20110701T14:00:00-1:00 (British Summer Time)

и

20110701T13:00:00+0:00 (UTC)

представляют собой точно такое же дата и время, а именно 13:00 по всемирному координированному времени.

Пока потребитель обрабатывает это правильно (что, похоже, так и есть, глядя в отражатель), это не имеет значения.

Если вы взяли это и передали как временную строку, то, конечно, это может иметь значение, но не в этом случае.

Вы можете увидеть эффект с помощью следующего кода (при условии, что вы сами не находитесь в UTC - если это так - измените настройки, чтобы проверить!). Оба они выводят одно и то же datetime, как только вы попросили преобразовать его в UTC.

WriteDateTime(DateTime.Now);
WriteDateTime(DateTime.UtcNow);

public static void WriteDateTime(DateTime dateTime)
{
   Console.WriteLine(dateTime.ToUniversalTime().ToLongTimeString());   
}
person Rob Levine    schedule 31.01.2011
comment
Для этого лучше всего использовать DateTime.UtcNow, потому что он быстрее, чем DateTime.Now. - person Alexander van Trijffel; 24.08.2012
comment
Это неверный ответ. DateTime не хранит никакого смещения, поэтому DateTime.Now и DateTime.UtcNow очень разные. Вопрос относится к тому, что ожидают браузеры, и правильный ответ состоит в том, что они ожидают значения со смещением 0 (UTC). Итак, правильный ответ на самом деле тот, который предлагает @Phil Carson ниже. - person Talon; 31.10.2016
comment
@Talon: DateTime имеет свойство Kind, для которого установлено значение DateTimeKin.Utc для DateTime.UtcNow и DateTimeKind.Local для DateTime.Now; Хотя он не используется для сравнения (просто отметьте равенство), он влияет на конверсии. ToUniversalTime () - это Noop, если Kind равно Utc, выполняет ли сдвиг местного часового пояса, если .Unspecified или .Local; Таким образом, метод HttpCookie может отличить их друг от друга при преобразовании их в Universal при использовании, как указал Роб. - person user6649841; 25.06.2021

Вы должны использовать метод DateTime.UtcNow, потому что это стандарт времени, используемый для файлов cookie. UTC эквивалентно GMT.

Из MSDN: System.DateTime.UtcNow

Получает объект DateTime, для которого заданы текущая дата и время на этом компьютере, выраженные как всемирное координированное время (UTC).

Обратитесь к this для объяснения между ними.

person Phil Carson    schedule 31.01.2011
comment
Я знаю. проблема в том, что даже на странице MSDN они используют DateTime.Now msdn.microsoft.com/en-us/library/, и это меня беспокоит. Я не знаю, просто ли им все равно, если HttpCookie.Expires уже преобразован в GMT: P - person vtortola; 31.01.2011
comment
-1 - Я не верю, что это правильно - не должно иметь никакого значения, что вы используете. - person Rob Levine; 31.01.2011
comment
Роб, как вы указали, технически использование любого из них из-за реализации метода будет работать. Есть и другие соображения: - person Phil Carson; 01.02.2011
comment
например, результат метода SetExpires - это DateTime в формате UTC, поэтому, передавая DateTime в формате UTC, вы демонстрируете ясность реализации. Еще одно соображение, хотя в данном случае это очень необычно, но важно как общий принцип, если реализация метода SetExpire (метод вне нашей кодовой базы) должна измениться так, чтобы он не преобразовывался (или преобразовывался неправильно), тогда в наш код, а затем мы исправим. (извините за разделенный комментарий, я нажал Enter, а затем меня прервали, пока я редактировал комментарий ...;) - person Phil Carson; 01.02.2011
comment
@RobLevine Имеет большое значение, какой из них вы используете. DateTime не хранит никакого смещения, поэтому DateTime.Now может быть 2016-10-10 05:00, а DateTime.UtcNow может быть 2016-10-09-23: 00. DateTimeOffset.Now и DateTimeOffset.UtcNow - это одно и то же. - person Talon; 31.10.2016