Python从AT + CCLK结果编译的字符串创建闹钟Telit HE910调制解调器

时间:2015-03-28 10:23:22

标签: python date alarm

我正在尝试根据从Telit HE910调制解调器返回的字符串创建基于闹钟/时间表的时钟。 AT命令是AT + CCLK,字符串结果是:+ CCLK:“2015/03 / 26,14:23:22 + 40”。我已将字符串分解为变量的时间戳,其中包含 - YYYY - 年/ MM - 月/ DD - 日/ hh - 小时/ mm - 分钟/秒 - 秒/安培 - 上午或下午。所有变量都是字符串,数字类型可以安全地浮动(mm)等。 我遇到的问题是我不知道如果我的程序没有执行程序的另一部分并且根据下面的代码错过了确切的分钟,如何比较分钟数。任何人都可以启发一种更简单的方法,这样可以比较分钟加上5分钟,以防系统在其他地方,特别是如果闹钟设置时间是XX小时59分钟。 (系统的另一部分可以让程序看到这段代码大约5分钟左右)

    def alarm_function(Time, Alarm): # Time Dictionary, Alarm Dictionary
        if Time['ampm'] == Alarm['ampm']:
            if Time['hh'] == Alarm['hh']:
                if float(Time['mm']) == ((float(Alarm['mm']) or (float(Alarm['mm'] + 1) or (float(Alarm['mm'] + 2) or (float(Alarm['mm'] + 3) or (float(Alarm['mm'] + 4) or (float(Alarm['mm'] + 5)):
                    return True
        return False

仅视觉表达的分钟比较...

1 个答案:

答案 0 :(得分:0)

以下是如何将AT+CCLK?响应解析为表示UTC时间的日期时间对象:

from datetime import datetime, timedelta

cclk_answer = "+CCLK: 15/03/26,14:23:22+40"
local_time = datetime.strptime(cclk_answer[:-3], "+CCLK: %y/%m/%d,%H:%M:%S")
utc_offset = timedelta(minutes=15*int(cclk_answer[-3:]))
utc_time = local_time - utc_offset
# -> datetime.datetime(2015, 3, 26, 4, 23, 22)

注意:如果年份是4位数,请使用%Y,但the manual表示年份使用2位数(%y)表示。

获得utc时间后,您可以直接将其与其他日期时间对象(UTC)进行比较:

if abs(utc_time - alarm_time) < timedelta(minutes=5):
    print("the modem time is within 5 minutes from the alarm time")

顺便说一句,以UTC current_time = datetime.utcnow()获取当前时间。