Java 12am is stored as 24?



所以我和我的伙伴已经在这个项目上工作了一段时间了。在这个项目中,我们经常使用日期,最近我们注意到一个问题,我们在这一点上相当深入。

我们将时间以格式化字符串的形式存储在SQLlite (Android项目)中,因为很多时候它们是直接绑定到listviews之类的。

我们注意到的问题,我发现有点奇怪,是SimpleDateTimeFormat对象,当用于格式化为24小时时间(这是一个基于医疗的项目,所以24小时时间是这里的惯例)12:00am-12:59am被格式化为24:00-24:59,而不是00:00-00:59…

这不是一个太大的问题,直到我们查询数据库并按日期排序结果,在12:00am和12:59am之间的任何数据将显示在列表的末尾,但它应该显示在开始…

还有人遇到过这个问题吗?或者知道如何绕过它?最好的方法是将数据存储为00:00而不是24:00。

欢呼

我强烈怀疑您使用了错误的模式。我们不得不猜测,因为您没有发布任何代码(提示,提示),但我怀疑您使用的是像

这样的模式。
kk:mm:ss
不是

HH:mm:ss

示例代码:

import java.util.*;
import java.text.*;
public class Test {
    public static void main(String[] args) throws Exception {
        SimpleDateFormat broken = new SimpleDateFormat("kk:mm:ss");
        broken.setTimeZone(TimeZone.getTimeZone("Etc/UTC"));
        SimpleDateFormat working = new SimpleDateFormat("HH:mm:ss");
        working.setTimeZone(TimeZone.getTimeZone("Etc/UTC"));
        Date epoch = new Date(0);
        System.out.println(broken.format(epoch));
        System.out.println(working.format(epoch));
    }
}

另外,正如其他人指出的那样,你不应该以字符串格式存储你的值。尽可能避免字符串转换,因为每次转换都是一个潜在的痛点。

请阅读这篇和这篇关于SQLite如何存储日期(或不存储日期)的文章。SQLite没有"Date"类型,所以它被存储为字符串。您应该将日期存储为整数(毫秒),然后您可以使用日期和时间函数(从第一个链接)将它们取出。

来自文档

1.2日期时间数据类型

SQLite没有专门的存储类来存储日期和/或时间。相反,SQLite的内置日期和时间函数能够将日期和时间存储为TEXT、REAL或INTEGER价值观:

文本为ISO8601字符串("YYYY-MM-DD HH:MM:SS.SSS")。真实的朱利安日数,即格林威治从11月的中午算起的天数公元前4714年24日,根据预言的公历。整数作为Unix时间,从UTC时间1970-01-01 00:00:00开始的秒数。应用程序可以选择在其中任何一种存储日期和时间格式和格式之间自由转换使用内置的日期和时间函数。

我更喜欢INTEGER/Unix时间存储,然后在从DB提取时使用内置的日期和时间函数进行格式化。

编辑:同样,这将处理排序。我猜你当前在SQLite中对日期的"排序"是基于字符串的,这很糟糕。

传递给SimpleDateFormat的格式字符串是什么?根据文档,使用"H"表示小时数应该是0-23,使用"k"应该是1-24。

最新更新