35

我以这种格式将日期存储在 SQLite 数据库中:

d-MMM-yyyy,HH:mm:ss aaa

当我使用该格式检索日期时,除了小时之外,我得到的一切都很好。小时总是00。这是我的输出:

String date--->29-Apr-2010,13:00:14 PM
After convrting Date--->1272479414000--Thu Apr 29 00:00:14 GMT+05:30 2010

这是代码:

    Date lScheduledDate = CalendarObj.getTime();
    DateFormat formatter = new SimpleDateFormat("d-MMM-yyyy,HH:mm:ss aaa");
    SomeClassObj.setTime(formatter.format(lScheduledDate));

    String lNextDate = SomeClassObj.getTime();
    DateFormat lFormatter = new SimpleDateFormat("d-MMM-yyyy,HH:mm:ss aaa");
    Date lNextDate = (Date)lFormatter.parse(lNextDate);
    System.out.println("output here"+lNextDate);

我究竟做错了什么?

4

4 回答 4

61

我认为您的日期格式没有意义。没有下午 13:00。删除格式末尾的“aaa”或将 HH 转换为 hh。

不过,这对我来说很好:

String testDate = "29-Apr-2010,13:00:14 PM";
DateFormat formatter = new SimpleDateFormat("d-MMM-yyyy,HH:mm:ss aaa");
Date date = formatter.parse(testDate);
System.out.println(date);

它打印“Thu Apr 29 13:00:14 CEST 2010”。

于 2010-04-29T06:31:39.437 回答
5

听起来您可能想要使用 SimpleDateFormat 之类的东西。 http://java.sun.com/j2se/1.4.2/docs/api/java/text/SimpleDateFormat.html

您声明日期格式,然后使用您的字符串调用 parse 方法。

private static final DateFormat DF = new SimpleDateFormat(...);
Date myDate = DF.parse("1234");

正如纪尧姆所说,设置时区!

于 2010-04-29T06:03:34.430 回答
2

您应该在 DateFormat 中设置 TimeZone,否则它将使用默认设置(取决于计算机的设置)。

于 2010-04-29T05:59:40.993 回答
0

java.time

虽然在 2010 年,java.util.Date是我们都使用的类(连同DateFormatCalendar),但这些类总是设计得很糟糕,现在早已过时。今天人们会使用 java.time,现代 Java 日期和时间 API。

        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("d-MMM-yyyy,HH:mm:ss");

        String dateTimeStringFromSqlite = "29-Apr-2010,13:00:14";
        LocalDateTime dateTime = LocalDateTime.parse(dateTimeStringFromSqlite, formatter);
        System.out.println("output here: " + dateTime);

输出是:

此处输出:2010-04-29T13:00:14

你的代码出了什么问题?

大写HHaaa格式模式字符串的组合没有多大意义,因为HH它是一天中的一个小时,使 AM/PM 标记变得aaa多余。不过,它不应该造成任何伤害,而且我无法重现您报告的确切结果。无论如何,无论您使用的是老式的SimpleDateFormat还是现代的,您的评论都是中肯的DateTimeFormatter

不应使用 'aaa',如果使用 'aaa' 则指定 'hh'

小写hh是 AM 或 PM 中的小时,从 01 到 12,因此需要 AM/PM 标记。

其他提示

  • 在您的数据库中,由于我知道 SQLite 没有内置日期时间类型,因此请使用标准 ISO 8601 格式并以 UTC 存储时间,例如2010-04-29T07:30:14Z(现代Instant类将此类字符串解析和格式化为其默认值,即没有任何明确的格式化程序)。
  • 不要使用偏移量,例如GMT+05:30时区。首选实时时区,例如 Asia/Colombo、Asia/Kolkata 或 America/New_York。
  • 如果你想使用 outdated DateFormat,它的parse方法返回 a Date,所以你不需要强制转换Date lNextDate = (Date)lFormatter.parse(lNextDate);

问题:我可以在 Android 上使用 java.time 吗?

是的,java.time 在较旧和较新的 Android 设备上运行良好。它只需要至少Java 6

  • 在 Java 8 及更高版本以及更新的 Android 设备(从 API 级别 26 开始)中,现代 API 是内置的。
  • 在 Java 6 和 7 中获得 ThreeTen Backport,现代类的后向端口(ThreeTen 用于 JSR 310;请参阅底部的链接)。
  • 在(较旧的)Android 上使用 ThreeTen Backport 的 Android 版本。它被称为 ThreeTenABP。并确保从org.threeten.bp子包中导入日期和时间类。

链接

于 2019-02-09T09:02:29.620 回答