使用Python发送短信;考虑时区的时间延迟

1 投票
3 回答
538 浏览
提问于 2025-04-17 02:23

我有一段代码,可以接收手机相关的信息,比如电话号码、名字和消息,这样就能发送短信。此外,还有一个功能可以延迟发送短信。用户可以通过下拉菜单选择在稍后的时间发送消息。这个延迟功能会检查消息发送的时间是否在凌晨12点到早上8点之间,如果是的话,就会默认设置为早上8点,这样接收者最早会在早上8点收到消息。

不过,我遇到的问题是,延迟时间是按照山地夏令时(加拿大/美国)来计算的。这就导致住在太平洋夏令时区的人会在早上7点收到消息(太早了),而住在东部夏令时区的人则会在早上10点收到消息(晚了2小时)。所以我在想,是否有一些Python代码可以检测接收者所在的时区,这样他们就能按时收到消息(比如我在内华达州选择早上8点,那么加利福尼亚的接收者也会在早上8点收到消息)。前提是我知道接收者所在的地区(例如,代码已经给出接收者在加利福尼亚)。

有没有什么好的方法来解决这个问题呢?

谢谢!

3 个回答

0

关于时区的问题,最好是先猜测一下,然后再确认,因为如果你没有像GPS那样的设备,可能会猜错。而且,猜测并不是一件简单的事,但为了提升用户体验,这样做是值得的。

消息是通过手机短信发送的,还是通过网页发送的呢?如果是手机发送的,可以使用一个像电话号码查询API,就像@Adithya建议的那样。如果是通过网页发送的,可以试试像http://www.hostip.info/这样的地理IP服务。然后,你需要找到一个可以把地理坐标转换成时区的服务。我现在想不起来有什么,但我相信你可以通过谷歌搜索找到一些。

另外,要记住,手机的IP地址通常很难进行地理定位。如果是通过手机使用网页界面,我可能连这个方法都不会考虑。可以试试HTML5地理定位

0

要准确知道手机拥有者的时区其实是很难的,除非你在他的手机上运行了一些自己的代码,因为手机的拥有者可能正在不同的时区旅行。

为了解决这个问题,你可以选择两种方法……

最佳猜测:你可以使用一个反向电话号码查询的API,比如看看这个链接 http://www.phonenumber.com/phone/1-214-213-1234。这个链接清楚地告诉你这个号码属于德克萨斯州,所以你可以猜测使用德克萨斯的时区,虽然这并不总是准确,但大多数情况下是对的。你需要根据自己的需求寻找合适的API。

安全起见:确保你发送的时间在任何时区都不是太极端,这样就不会打扰到别人。比如说,你选择中部时间的早上8:30,这样在太平洋时间就是早上6:30,在东部时间就是早上9:30,这样在任何时区都不会太早或太晚。

0

快速简单的方法: 你可以让用户告诉你事件应该在多少小时/分钟后发生。这样就不需要考虑他们的本地时区了。

更好的方法: 如果你能获取手机的本地时间和UTC时间(可以从手机或者你的服务器获取),那么你就能知道手机的UTC偏移量。大多数情况下,这样做是可以的。但要注意,UTC偏移量并不等同于本地时区。在夏令时或夏季时间的边界附近,像“明天同一时间”这样的想法就会出问题,因为你假设UTC偏移量和时区是一样的。

最佳方法: 如果想正确支持各国的时区政策,使用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

撰写回答