簡體   English   中英

如何在iOS和Python上創建統一的unix時間戳?

[英]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

但是還是有些差異。

  1. 也許是因為Python方面是UTC,iOS默認情況下以BST顯示時間,我需要解決這個問題。 截至昨晚,英國夏令時已不再,但iOS仍報告BST。 根據我的理解,作為NSDate對象總是在UTC中,這令人困惑。

  2. 一旦工作,是否可以安全地將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.

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