![](/img/trans.png)
[英]Extract unix timestamp from <tag datetime=“unix-timestamp”>
[英]How to create a unified unix-timestamp both on iOS and Python?
我正在開發需要與GAE上基於Python的REST服務同步的iOS應用程序。
在python后端中,我像這樣創建時間戳:
def create_timestamp(date):
midnight = datetime.time(0)
date_midnight_time = datetime.datetime.combine(date.date(), midnight)
return calendar.timegm(date_midnight_time.utctimetuple())
我傳入了datetime.datetime.today()
以上的函數。 這將在2013年10月27日00:00:00返回值1382832000
。
在iOS上有一個內置函數:
由於算法的緣故,nextDate設置為今天的日期有點復雜:
NSDate *date = [NSDate date];
NSCalendar *calendar = [NSCalendar currentCalendar];
NSDateComponents *components = [calendar components:(NSEraCalendarUnit | NSYearCalendarUnit | NSMonthCalendarUnit) fromDate:date];
[components setDay:27];
NSDate *nextDate = [calendar dateFromComponents:components];
[nextDate timeIntervalSince1970]
會在2013-10-27 00:00:00 BST
返回值1382828400.000000
但是還是有些差異。
也許是因為Python方面是UTC,iOS默認情況下以BST顯示時間,我需要解決這個問題。 截至昨晚,英國夏令時已不再,但iOS仍報告BST。 根據我的理解,作為NSDate對象總是在UTC中,這令人困惑。
一旦工作,是否可以安全地將iOS double值強制轉換為int,以獲得類似於Python端的舍入整數?
我知道這很老了,但我想我會回應,因為這個問題我已經尋找了一段時間了:
您提供的IOS時間戳是指該日期GMT的正確午夜。 您提供的python時間戳記是指一個小時前(前一天的晚上11:00)。
這花了我一輩子的時間,這是一種非常聰明的實現方式(尤其是當您考慮到我所見過的更多ous回選項時):
我嘗試了這一點,並且在嘗試獲取您本地區域中日期時間的時間戳時非常有效(但是..):
from datetime import datetime
def dt_to_timestamp(dt_object):
"""Not really a good, universal solution"""
return eval(dt_object.strftime('%s.%f'))
dt_to_timestamp(datetime.now()) - time.time()
# -0.0002155303955078125
..但是一旦查看本地區域之外的對象,它就會嚴重失敗:
from tzlocal import get_localzone
from pytz import utc
utc_now = datetime.now(tz=localzone).astimezone(utc)
dt_to_timestamp(utc_now) - time.time()
# 21599.98956131935, more commonly known as 21600 -- my offset from UTC
這是我最終得到的結果:
from datetime import datetime
from pytz import utc
def dt_to_timestamp(dt_object):
"""Provides timestamp for any zone-aware datetime object.
Works with Python 2.7 and Python 3.3, possibly others.
Raises TypeError when naive datetime objects are given.
"""
epoch = datetime(1970, 1, 1, tzinfo=utc)
delta = dt_object - epoch
return delta.total_seconds()
# example usage:
from tzlocal import get_localzone
ts = 1382832000
utc_dt = utc.localize(datetime.utcfromtimestamp(ts))
local_dt = utc_dt.astimezone(get_localzone())
ts == dt_to_timestamp(utc_dt) == dt_to_timestamp(local_dt)
# True
無論時區如何,它都能准確地處理已知的日期時間對象。 如果呼叫者不知道時區以便將其轉換為已知時區,則還有其他問題。 :-)我認為,應該盡可能使用已知的日期時間對象,而當不使用已知的日期時間對象時,請使用UTC日期時間。
我發現這個答案的信息(其中包括了很多其他的細節) 這里 。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.