使用Python发送SMS消息;考虑时区的时间延迟



所以我有一个代码,用于接收移动设备的相关信息,如电话号码、姓名和消息,通过它可以发送SMS消息。此外,还有一个延迟短信的功能。因此,用户可以使用下拉菜单选择稍后发送消息。此外,延迟函数检查消息是否在12:00am至8:00am之间发送,如果是,则返回默认的8:00am,因此接收者最早将在8:00am收到消息。然而,我面临的问题是,时间延迟是在山地夏令时(加拿大/美国),这意味着生活在PDT时区的人将在早上7点收到消息(早了一个小时),而生活在EDT时区的人将在上午10点收到消息(晚了2个小时)。因此,我想知道是否有一些python代码可以潜在地检测接收器位于哪个时区,以便他/她按时接收消息(如果我选择内华达州的上午8:00,那么加利福尼亚州的接收器将在PDT上午8:00接收消息),给定接收器所在的区域(例如。代码显示接收者位于加州)。

你知道如何处理这个问题吗?

谢谢!

Quick and Dirty:您可以通过让用户说明事件应该在多少小时/分钟后发生来避免这个问题。那么他们所在的时区就不重要了。

更好的:如果你有能力在手机上获得当地时间,以及UTC时间(从手机或从服务器),它将告诉你手机的UTC偏移量。大多数情况下你都可以侥幸逃脱。但是UTC偏移量与本地时区不同。在夏令时或夏令时边界附近,当您假设UTC偏移量与时区相同时,像"明天同一时间"这样的想法就会中断。

Best:要正确支持政治时区策略,没有什么可以替代Olson数据库。使用Olson意味着你的应用程序有一个配置项供用户设置他们的时区(例如:America/New_YorkEtc/UTC)。您可以根据电话和手机号码的UTC偏移量(使用其他答案中详细的查找表)选择默认值,并且大多数情况下都是正确的。

在Python中,pytz模块为您提供了一个非常干净的API,用于使用Olson数据库来处理datetime对象。

编辑:这个函数将Unix时间转换为本地化的datetime对象,给定一个时区对象:

def localize_epoch_time(epoch_time, timezone=pytz.UTC):
  u"Given an epoch time return an accurate, timezone-aware datetime object"
  t = localtime(epoch_time)
  epochdt = datetime(*(t[:6] + (int((epoch_time - long(epoch_time)) * 1000000), timezone)
  if hasattr(timezone, 'normalize'):  # pytz tzinfo objects have this
    return timezone.normalize(epochdt)
  else: # tzinfo object not from pytz module
    return epochdt

要准确知道手机主人的时区是不可能的,除非你在他的手机上运行一些你的代码,因为手机的主人可能是跨时区旅行的。

要解决这个问题,您可以做以下两件事之一....

最佳猜测:这是,使用反向电话查找API,如见http://www.phonenumber.com/phone/1-214-213-1234它清楚地告诉你,该号码属于德州,因此最好的猜测将使用德州时区,它并不总是准确的,但它是大多数时间。您需要根据您的使用情况查找api。

注意安全:确保你的分娩时间在任何时区都不是极端的,这样就不会有人受到干扰。因此,假设你选择中部时间上午8点30分。太平洋时间早上6:30,东部时间早上9:30,所以在任何时区都不会太早或太晚。

对于时区,最好是猜测和询问,因为除非您有类似gps的设备,否则您可能会猜错。猜测并不是一件容易的事,但为了改善用户体验,这是值得的。

消息是通过手机短信还是网络调度的?如果是在手机上,使用@Adithya建议的电话查找API。如果是在网上,可以试试像http://www.hostip.info/这样的地理ip服务。然后,您需要找到一个将地理坐标转换为时区的服务。我一时想不起来,但我相信你可以在谷歌上找到一些。

还要记住,手机的IP地址是出了名的难以定位的。如果这是一个从手机使用的网页界面,我可能甚至不会麻烦这个路线。尝试HTML5地理定位

最新更新