处理时钟变化时保存的纪元时间

Posted

技术标签:

【中文标题】处理时钟变化时保存的纪元时间【英文标题】:Dealing with saved epoch times when clocks change 【发布时间】:2013-06-09 04:59:57 【问题描述】:

我有一个闹钟应用,它使用以下两种方法:

private void fastForwardAlarmToNext24Hours()  
// Get Alarm Time (unix)
    DataStorageController alarmTimeController = new DataStorageController(getApplicationContext());
    epochAlarmTime = alarmTimeController.getAlarmTime();

    // Get Current Time (unix)
    long epochCurrentTime = System.currentTimeMillis() / 1000L;

    // While Alarm Time in the past, fast forward another 24 hours
    while (epochAlarmTime < epochCurrentTime) 
        epochAlarmTime = epochAlarmTime + (24*60*60); // Add a days worth of seconds
    


private Long getNumberOfSecondsUntilAlarm() 
    long epochCurrentTime = System.currentTimeMillis() / 1000L;
    return epochAlarmTime - epochCurrentTime;

这很好,我得到了这些结果:

夏天

10-12 07:46:26.678: D/CJS 记录 (776): epochCurrentTime: 1381560386 10/12/2013 7:46:26 AM +1 10-12 07:46:26.678: D/CJS 记录 (776): epochAlarmTime: 1381560480 10/12/2013 7:48:00 AM +1

但是,当我将设备的日期时间转发到冬季(时钟更改后)时,我得到以下结果,并且闹钟会在 1 小时后触发:

冬天

11-12 07:47:10.441: D/CJS 记录 (942): epochCurrentTime: 1384242430 11/12/2013 7:47:10 AM +0 11-12 07:47:10.441:D/CJS 日志记录(942):epochAlarmTime:1384325280 11/13/2013 6:48:00 AM +0

发生这种情况的原因是因为保存的闹钟时间保持相同的纪元时间,但是当时钟发生变化时,本地时间会移动 1 小时。

有人对如何处理这个问题有任何建议吗?

干杯,查理

【问题讨论】:

【参考方案1】:

您可能希望使用本地时间,而不是使用 UNIX 时间,使用 Calendar 实例:

// Get Current Time 
Calendar currentTime = GregorianCalendar.getInstance();

// While Alarm Time in the past, fast forward a day
while (alarmTime.before(currentTime)) 
    alarmTime.add(Calendar.DAY_OF_YEAR, 1);

【讨论】:

嗨 Yuku - 认为这看起来是个不错的选择。只有一个问题:然后我将如何形成方法 getNumberOfSecondsUntilAlarm() ?干杯,查理【参考方案2】:

可以报名吗

http://developer.android.com/reference/android/content/Intent.html#ACTION_TIME_CHANGED

并更新您的下一次发射时间?

【讨论】:

【参考方案3】:

System.currentTimeMillis() 返回的 long 值始终是 1970 年 1 月 1 日 UTC 之后的秒数。

根据您初始化时间戳的方式,可以显示不同的值(基于您的语言环境/机器/时间等)。

为了保持一致,请使用 GMT(或没有夏令时的时区)在内部处理您的时间。

【讨论】:

以上是关于处理时钟变化时保存的纪元时间的主要内容,如果未能解决你的问题,请参考以下文章

std chrono 时间同步

v3学院带你学习-时序逻辑中时钟上升沿对齐数据变化时的处理技巧的FPGA实现

上个月开始和结束的 Postgres 纪元摘录

Java使用长纪元时间戳来检测日变化的最有效方法

将列上的纪元时间保存到另一列 postgres

FPGA跨时钟域处理方法