Как преобразовать строку местного времени в UTC?

Когда вы объявляете ссылочную переменную (т. е. объект), вы действительно создаете указатель на объект. Рассмотрим следующий код, в котором вы объявляете переменную примитивного типа int:

int x;
x = 10;

В этом примере переменная x является int, и Java инициализирует ее для 0. Когда вы назначаете его 10 во второй строке, ваше значение 10 записывается в ячейку памяти, на которую указывает x.

Но когда вы пытаетесь объявить ссылочный тип, произойдет что-то другое. Возьмите следующий код:

Integer num;
num = new Integer(10);

Первая строка объявляет переменную с именем num, но она не содержит примитивного значения. Вместо этого он содержит указатель (потому что тип Integer является ссылочным типом). Поскольку вы еще не указали, что указать на Java, он устанавливает значение null, что означает «Я ничего не указываю».

Во второй строке ключевое слово new используется для создания экземпляра (или создания ) объекту типа Integer и переменной указателя num присваивается этот объект. Теперь вы можете ссылаться на объект, используя оператор разыменования . (точка).

Exception, о котором вы просили, возникает, когда вы объявляете переменную, но не создавали объект. Если вы попытаетесь разыменовать num. Перед созданием объекта вы получите NullPointerException. В самых тривиальных случаях компилятор поймает проблему и сообщит вам, что «num не может быть инициализирован», но иногда вы пишете код, который непосредственно не создает объект.

Например, вы можете имеют следующий метод:

public void doSomething(SomeObject obj) {
   //do something to obj
}

В этом случае вы не создаете объект obj, скорее предполагая, что он был создан до вызова метода doSomething. К сожалению, этот метод можно вызвать следующим образом:

doSomething(null);

В этом случае obj имеет значение null. Если метод предназначен для того, чтобы что-то сделать для переданного объекта, целесообразно бросить NullPointerException, потому что это ошибка программиста, и программисту понадобится эта информация для целей отладки.

Альтернативно, там могут быть случаи, когда цель метода заключается не только в том, чтобы работать с переданным в объекте, и поэтому нулевой параметр может быть приемлемым. В этом случае вам нужно будет проверить нулевой параметр и вести себя по-другому. Вы также должны объяснить это в документации. Например, doSomething может быть записано как:

/**
  * @param obj An optional foo for ____. May be null, in which case 
  *  the result will be ____.
  */
public void doSomething(SomeObject obj) {
    if(obj != null) {
       //do something
    } else {
       //do something else
    }
}

Наконец, Как определить исключение & amp; причина использования Трассировки стека

283
задан martineau 9 March 2019 в 01:07
поделиться

6 ответов

Спасибо @rofly, полное преобразование от строки до строки следующие:

time.strftime("%Y-%m-%d %H:%M:%S", 
              time.gmtime(time.mktime(time.strptime("2008-09-17 14:04:00", 
                                                    "%Y-%m-%d %H:%M:%S"))))

Моя сводка time / calendar функции:

time.strptime
строка-> кортеж (никакой примененный часовой пояс, так соответствует строке)

time.mktime
кортеж местного времени-> секунды с эпохи (всегда местное время)

time.gmtime
секунды с эпохи-> кортеж в UTC

и

calendar.timegm
кортеж в UTC-> секунды с эпохи

time.localtime
секунды с эпохи-> кортеж в локальном часовом поясе

62
ответ дан Community 23 November 2019 в 01:54
поделиться

Во-первых, проанализируйте строку в наивный объект даты и времени. Это - экземпляр datetime.datetime без приложенной информации о часовом поясе. См. документацию для datetime.strptime для получения информации о парсинге строки даты.

Использование pytz модуль, который идет с полным списком часовых поясов + UTC. Фигура, каков локальный часовой пояс, создает объект часового пояса из него, и управляет и присоединяет его к наивной дате и времени.

Наконец, используйте datetime.astimezone() метод для преобразования даты и времени в UTC.

Исходный код, с помощью локального часового пояса "America/Los_Angeles", для строки "03.02.2001 10:11:12":

import pytz, datetime
local = pytz.timezone ("America/Los_Angeles")
naive = datetime.datetime.strptime ("2001-2-3 10:11:12", "%Y-%m-%d %H:%M:%S")
local_dt = local.localize(naive, is_dst=None)
utc_dt = local_dt.astimezone(pytz.utc)

Оттуда, можно использовать strftime() метод для форматирования даты и времени UTC по мере необходимости:

utc_dt.strftime ("%Y-%m-%d %H:%M:%S")
252
ответ дан jojo 23 November 2019 в 01:54
поделиться
def local_to_utc(t):
    secs = time.mktime(t)
    return time.gmtime(secs)

def utc_to_local(t):
    secs = calendar.timegm(t)
    return time.localtime(secs)

Источник: http://feihonghsu.blogspot.com/2008/02/converting-from-local-time-to-utc.html

использование В качестве примера от bd808: Если Ваш источник datetime.datetime объект t, звоните как:

local_to_utc(t.timetuple())
25
ответ дан Community 23 November 2019 в 01:54
поделиться

Как насчет -

time.strftime("%Y-%m-%dT%H:%M:%SZ", time.gmtime(seconds))

если секунды равны Нет , тогда он преобразует местное время во время UTC, иначе преобразует прошедшее время в UTC.

3
ответ дан 23 November 2019 в 01:54
поделиться

Функция модуля даты utcnow() может быть использована для получения текущего UTC-времени.

>>> import datetime
>>> utc_datetime = datetime.datetime.utcnow()
>>> utc_datetime.strftime("%Y-%m-%d %H:%M:%S")
'2010-02-01 06:59:19'

Как ссылка, упомянутая выше Томом: http://lucumr.pocoo.org/2011/7/15/eppur-si-muove/ говорит:

UTC - это часовой пояс без летнего времени и все еще часовой пояс. без изменений конфигурации в прошлом.

Всегда измеряйте и сохраняйте время в UTC .

Если необходимо записать, где было взято время, сохраните это отдельно. Не сохраняйте информацию о местном времени + часовом поясе!

ПРИМЕЧАНИЕ - Если какая-либо из ваших данных находится в регионе, использующем DST, используйте питц и посмотрите на ответ Джона Милликина.

- Если вы хотите получить UTC время из заданной строки и вам повезло, что вы находитесь в регионе в мире, который либо не использует DST, либо у вас есть данные, которые только смещены из UTC без применения DST:

--> используя локальное время в качестве основы для значения смещения:

>>> # Obtain the UTC Offset for the current system:
>>> UTC_OFFSET_TIMEDELTA = datetime.datetime.utcnow() - datetime.datetime.now()
>>> local_datetime = datetime.datetime.strptime("2008-09-17 14:04:00", "%Y-%m-%d %H:%M:%S")
>>> result_utc_datetime = local_datetime + UTC_OFFSET_TIMEDELTA
>>> result_utc_datetime.strftime("%Y-%m-%d %H:%M:%S")
'2008-09-17 04:04:00'

--> Или, из известного смещения, используя дату времени. timedelta():

>>> UTC_OFFSET = 10
>>> result_utc_datetime = local_datetime - datetime.timedelta(hours=UTC_OFFSET)
>>> result_utc_datetime.strftime("%Y-%m-%d %H:%M:%S")
'2008-09-17 04:04:00'

UPDATE:

Поскольку питон 3.2 datetime.timezone доступен. Вы можете сгенерировать объект timezone aware datetime командой ниже:

import datetime

timezone_aware_dt = datetime.datetime.now(datetime.timezone.utc)

Если вы готовы принять преобразование часового пояса, прочтите это:

https://medium.com/@eleroy/10-things-you-need to-know-about-date-and time-in-python-with-datetime-pytz-dateutil-timedelta-309bfbafb3f7

133
ответ дан 23 November 2019 в 01:54
поделиться

, если вы предпочитаете datetime.datetime:

dt = datetime.strptime("2008-09-17 14:04:00","%Y-%m-%d %H:%M:%S")
utc_struct_time = time.gmtime(time.mktime(dt.timetuple()))
utc_dt = datetime.fromtimestamp(time.mktime(utc_struct_time))
print dt.strftime("%Y-%m-%d %H:%M:%S")
5
ответ дан 23 November 2019 в 01:54
поделиться
Другие вопросы по тегам:

Похожие вопросы: