1

我正在开发一个需要与 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 BST1382828400.000000

不过还是有些出入。

  1. 也许是因为 Python 端是 UTC,而 iOS 默认以 BST 显示时间,我需要解决这个问题。截至昨晚,英国夏令时已不复存在,但 iOS 仍报告 BST。这很令人困惑,因为根据我的理解,NSDate 对象总是在 UTC 中......

  2. 一旦它工作,将iOS双值转换为int是否安全,以获得类似于Python端的整数?

4

1 回答 1

0

我知道这是旧的,但我想我会回应,因为这个特殊问题是我一直在寻找答案的问题:

您提供的 IOS 时间戳是指该日期格林威治标准时间的正确午夜。您提供的 python 时间戳是指一小时前(前一天晚上 11:00)。

我花了很长时间才找到,这是一种非常聪明的方法(特别是当你考虑到我见过的许多更迂回的选择时):

我试过这个,它在尝试获取本地区域中日期时间的时间戳时效果很好(但是..):

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 日期时间。

我在这里找到了这个答案的信息(以及许多其他细节)。

于 2014-02-22T08:17:11.560 回答