Я использую Facebook С# SDK, чтобы получить некоторые данные со своей страницы в Facebook.
Когда я получаю объекты данных, в это время я получаю одно поле:
created_time : 2014-05-23T11:55:00+0000
Как это не так, как мое текущее время, как мне преобразовать его в мое текущее время или в стандартное время UTC?
Для меня код:
DateTime.Parse("2014-05-23T11:55:00+0000").ToString()
возвращается
2014-05-23 12:55:00
Поскольку "DateTime.Parse()" понимает часовой пояс в этой строке и по умолчанию создает локальное время. Мой часовой пояс - это ирландское летнее время, на час раньше, чем UTC, для меня это означает 2014-05-23T12: 55: 00, для вас это будет другое время в зависимости от вашего часового пояса.
Для обратного, чтобы получить время, проанализированное в UTC (более полезно для закулисных веб-материалов или хранилища, а не для пользовательского интерфейса), используйте DateTime.Parse("2014-05-23T11:55:00+0000").ToUniversalTime()
Если вам нужно иметь дело с часовыми поясами, отличными от локальных, на компьютере, на котором работает код, или на UTC, тогда вам нужно будет использовать DateTimeOffset
, за исключением того, что DateTimeParse
будет обрабатывать другие временные интервалы в строке, но с этой точки понятия "местное время", "универсальное время" и "неизвестный часовой пояс".
Я бы использовал DateTimeOffset.ParseExact
, указав в строке формата инвариантную культуру:
DateTimeOffset value = DateTimeOffset.ParseExact(text, "yyyy-MM-dd'T'HH:mm:ssK",
CultureInfo.InvariantCulture);
Я настоятельно рекомендую это использовать DateTime.Parse
по следующим причинам:
Первые два из них могут быть исправлены с использованием DateTime.ParseExact
и, конечно же, определения культуры.
Затем вы можете преобразовать это в свой локальный часовой пояс или в любой другой часовой пояс, который вы хотите, включая локальный часовой пояс вашей системы. Например:
DateTimeOffset localTime = value.ToLocalTime(); // Applies the local time zone
или если вы хотите использовать DateTime
:
DateTimeOffset localTime = value.ToLocalTime().DateTime;
Это всего лишь одна дополнительная строка кода, но она делает более понятной (ИМО) то, что вы пытаетесь сделать. Кроме того, проще сравнивать значения DateTimeOffset
не беспокоясь о том, что такое "вид" и т.д.
На самом деле, я бы лично не использовал DateTimeOffset
или DateTime
- я бы использовал OffsetDateTime
из моего проекта Noda Time, но это другое дело.
it's explicitly stating that you don't want to use the local culture, which might have a different default calendar system
<- не могли бы вы привести пример или ссылку, где это идет не так? я понимаю, как это относится к десятичной, а не DateTimeDateTime.Parse
может обнаружить, что это формат, подобный ISO-8601, и в любом случае проанализировать его с помощью григорианского календаря. Но если вы находитесь в такой культуре, как Саудовская Аравия, и вы анализируете дату, она будет применять локальную календарную систему с различными представлениями о годах и т. Д. (Например, в настоящее время мы находимся в 1435 году в календаре Um Al Qura. ) Я предпочитаю четко указывать, что это не строка формата, созданная пользователем; это межмашинное взаимодействие, поэтому следует использовать инвариантную культуру.