2013-10-27 68 views
1

我正在開發一個iOS應用程序,需要與GAE上的基於Python的REST服務同步。如何在iOS和Python上創建統一的unix-timestamp?

在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上存在的一個的buildin功能:

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

雖然有一些差異。

  1. 也許是因爲Python端是UTC,iOS默認顯示BST的時間,我需要解決這個問題。截至昨晚,英國夏令時間不再,但iOS仍然報告BST。雖然作爲一個NSDate對象,但令人困惑的總是以我的理解UTC。

  2. 一旦它的工作,是安全的投的iOS雙 值爲int,以獲得一個類似的整數Python方面?

回答

0

我知道這是老了,但我想我會作出迴應,因爲這個特殊的問題是我一直在尋找一個答案了一會兒:

你給的IOS時間戳指到那天的格林尼治標準時間的正確午夜。 您提供的python時間戳是指提前一小時(前一天的晚上11點)。

這花了我永遠找到,這是做這件事(尤其是當你考慮到我已經看到了很多更迂迴的選擇)的一個非常聰明的辦法:

我想這一點,並試圖當它很好地工作以獲取日期時間的時間戳在您的本地區域(但..):

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日期時間。

我找到了這個答案的信息(在很多其他的細節中)here