【发布时间】:2023-04-07 19:15:01
【问题描述】:
最近我尝试使用当前日期的毫秒表示作为数据库(领域)的主键。
我可以获取日期作为字符串并存储它,但由于我需要对大量数据执行快速升序搜索,我决定以毫秒格式存储数据。
为了实现这一点,我遵循了以下步骤:
1) 初始化一个 GregorianCalendar 实例并传递当前日期
Calendar c = new GregorianCalendar();
c.setTime(new Date());
2) 设置时间以精确匹配当天的午夜
c.set(Calendar.HOUR_OF_DAY,0);
c.set(Calendar.MINUTE,0);
c.set(Calendar.SECOND,0);
c.set(Calendar.MILLISECOND,0);
3) 将结果转换为毫秒
c.getTime().getTime()
后来我通过将对象插入数据库来测试它。 下面是日志输出。我多次计算了同一个日期,都是通过上面的代码,没有任何变化。
01-03 06:59:38.607 16256-16256/com.example.bizarre.bindaccess D/Day: Long: 1 422 528 534 032 Date: 29.01.15
01-03 06:59:38.611 16256-16256/com.example.bizarre.bindaccess D/Day: Long: 1 422 528 647 420 Date: 29.01.15
01-03 06:59:38.611 16256-16256/com.example.bizarre.bindaccess D/Day: Long: 1 422 528 669 794 Date: 29.01.15
01-03 06:59:38.611 16256-16256/com.example.bizarre.bindaccess D/Day: Long: 1 422 528 707 566 Date: 29.01.15
01-03 06:59:38.615 16256-16256/com.example.bizarre.bindaccess D/Day: Long: 1 422 532 686 557 Date: 29.01.15
01-03 06:59:38.615 16256-16256/com.example.bizarre.bindaccess D/Day: Long: 1 422 532 726 052 Date: 29.01.15
01-03 06:59:38.615 16256-16256/com.example.bizarre.bindaccess D/Day: Long: 1 422 532 754 147 Date: 29.01.15
尽管我的操作为零小时、分钟、秒和毫秒,并且每次我得到稍微不同的值时都会得到一个以毫秒为单位的清除午夜值。
我的建议是:
1) 取决于设备时间方案。
2)它本身与android有关。
3) 麻烦就在我身边。
如果有人可以帮助我,我会很高兴。
附:我还使用了一个站点http://www.fileformat.info/tip/java/date2millis.htm 来获得 29.01.15 的毫秒数,结果是 1 422 489 600 000。
更新 #1。 1)所有插入都在同一个设备上,本地时区没有改变,所以环境不受影响。 2) 正如我上面所说的,也许不清楚 - 我将数据保存在 millis 中,在一个 long 类型的类字段中。无论如何,该字段也不受影响。
更新 #2。实际上,我的问题是:“我遇到的行为如何解释?”。但由于它可能过于宽泛或不清楚,我将重点放在我最初想要实现的目标上 - “如何以一致的毫秒值的形式获取本地(设备上)时区的当前日期(类型长)?“
【问题讨论】:
-
您如何从数据库中保存和检索日历?如果您将时间设置为零,则不应改变毫秒值
-
所有设备都使用相同的时区吗?
-
@k3b 更新答案,提供您要求的信息。
-
@Hugo 更新了答案,提供了您要求的信息。
-
您的问题是:如何获取一个从纪元开始计数的数字并将其更改为以 UTC 表示该日期的 00:00:00 时间?
标签: java android database date time