Измените время сервера на местное время, отправленное Facebook

1

Я использую Facebook С# SDK, чтобы получить некоторые данные со своей страницы в Facebook.

Когда я получаю объекты данных, в это время я получаю одно поле:

created_time : 2014-05-23T11:55:00+0000

Как это не так, как мое текущее время, как мне преобразовать его в мое текущее время или в стандартное время UTC?

Теги:
datetime
datetime-format
facebook-c#-sdk

2 ответа

1
Лучший ответ

Для меня код:

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 будет обрабатывать другие временные интервалы в строке, но с этой точки понятия "местное время", "универсальное время" и "неизвестный часовой пояс".

1

Я бы использовал DateTimeOffset.ParseExact, указав в строке формата инвариантную культуру:

DateTimeOffset value = DateTimeOffset.ParseExact(text, "yyyy-MM-dd'T'HH:mm:ssK",
                                                 CultureInfo.InvariantCulture);

Я настоятельно рекомендую это использовать DateTime.Parse по следующим причинам:

  • Это всегда использует инвариантную культуру. Он явно заявляет, что вы не хотите использовать локальную культуру, которая может иметь другую систему календаря по умолчанию и т.д.
  • Это точно определяет формат. Если данные станут "10/06/2014 11:55:00", вы получите исключение, которое лучше, чем молча предполагать, является ли это dd/MM/yyyy или MM/dd/yyyy
  • Он точно представляет данные в строке: дата/время и смещение. Затем вы можете делать все, что хотите, с этими данными, но разделение этих двух шагов более ясное

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

Затем вы можете преобразовать это в свой локальный часовой пояс или в любой другой часовой пояс, который вы хотите, включая локальный часовой пояс вашей системы. Например:

DateTimeOffset localTime = value.ToLocalTime(); // Applies the local time zone

или если вы хотите использовать DateTime:

DateTimeOffset localTime = value.ToLocalTime().DateTime;

Это всего лишь одна дополнительная строка кода, но она делает более понятной (ИМО) то, что вы пытаетесь сделать. Кроме того, проще сравнивать значения DateTimeOffset не беспокоясь о том, что такое "вид" и т.д.

На самом деле, я бы лично не использовал DateTimeOffset или DateTime - я бы использовал OffsetDateTime из моего проекта Noda Time, но это другое дело.

  • 0
    it's explicitly stating that you don't want to use the local culture, which might have a different default calendar system <- не могли бы вы привести пример или ссылку, где это идет не так? я понимаю, как это относится к десятичной, а не DateTime
  • 1
    @wal: В данном конкретном случае DateTime.Parse может обнаружить, что это формат, подобный ISO-8601, и в любом случае проанализировать его с помощью григорианского календаря. Но если вы находитесь в такой культуре, как Саудовская Аравия, и вы анализируете дату, она будет применять локальную календарную систему с различными представлениями о годах и т. Д. (Например, в настоящее время мы находимся в 1435 году в календаре Um Al Qura. ) Я предпочитаю четко указывать, что это не строка формата, созданная пользователем; это межмашинное взаимодействие, поэтому следует использовать инвариантную культуру.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню