簡體   English   中英

如何在Python中的UTC中獲取時間戳

[英]How to get timestamp in UTC in Python

我使用的API的端點可以按日期過濾。 日期必須是自紀元以來的時間戳(以秒為單位),並且必須采用UTC,以便可以正確過濾API

這就是我今天嘗試過的

first_day = datetime.utcnow().replace(day=1)
first_day = first_day.replace(hour=0, minute=0, second=0, microsecond=0)
print(first_day, int(first_day.timestamp()))

last_day =    datetime.utcnow().replace(day=calendar.monthrange(datetime.utcnow().year,     datetime.utcnow().month)[1])
last_day = last_day.replace(hour=0, minute=0, second=0, microsecond=0)
print(last_day, int(last_day.timestamp()))

這是我的輸出

2019-01-01 00:00:00 1546318800
2019-01-31 00:00:00 1548910800

然后,當我將一月的第一天的時間戳記為1546318800,然后轉到https://www.epochconverter.com/並將其粘貼到人類日期時,我得到以下信息:

GMT:2019年1月1日,星期二,5:00:00 AM您所在的時區:2019年1月1日,星期二,格林尼治標准時間-05:00:00

我希望格林尼治標准時間是2019年1月1日上午12:00:00

我該怎么做?

您正在使用朴素的 datetime對象。 對於朴素的datetime對象,假定時間為本地時間,因此首先應用本地系統時區偏移量。 `datetime.timestamp()文檔中

假定朴素的datetime實例表示本地時間,並且此方法依賴於平台C mktime()函數執行轉換。

並進一步:

注意 :沒有方法可以直接從表示UTC時間的朴素的datetime實例中獲取POSIX時間戳。 如果您的應用程序使用此約定,並且系統時區未設置為UTC,則可以通過提供tzinfo=timezone.utc獲得POSIX時間戳:

 timestamp = dt.replace(tzinfo=timezone.utc).timestamp() 

請注意,通過使用daetime.date對象並使用datetime.combine() ,可以使日期計算邏輯更加容易。 此方法還接受新的時區值,因此您可以在此階段傳遞timezone.utc時區:

from datetime import datetime, date, time, timedelta, timezone

# create first and last day of the month
first_day = date.today().replace(day=1)
last_day = (first_day + timedelta(days=31)).replace(day=1) - timedelta(days=1)
first_day = int(datetime.combine(first_day, time.min, tzinfo=timezone.utc).timestamp())
last_day = int(datetime.combine(last_day, time.min, tzinfo=timezone.utc).timestamp())

上面的方法通過首先添加31天(無論當前時間如何,保證到下個月),然后將該新日期降到該月的第一天,然后減去一天,來計算該月的最后一天。

演示:

>>> from datetime import datetime, date, time, timedelta, timezone
>>> first_day = date.today().replace(day=1)
>>> last_day = (first_day + timedelta(days=31)).replace(day=1) - timedelta(days=1)
>>> first_day, last_day
(datetime.date(2019, 1, 1), datetime.date(2019, 1, 31))
>>> int(datetime.combine(first_day, time.min, tzinfo=timezone.utc).timestamp())
1546300800
>>> int(datetime.combine(last_day, time.min, tzinfo=timezone.utc).timestamp())
1548892800

請注意,在1月31日午夜,該月的另外24小時仍未發現。 您可能需要從上述last_day計算中刪除- timedelta(days=1)減法以切換到2月1日午夜(1548979200),或使用time.max將時間戳轉換為23:23:59(午夜前1秒) )於31日(1548979199)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM