将String转换为java.util.Date

时间:2010-04-29 05:48:13

标签: java date datetime-format

我将日期存储在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 个答案:

答案 0 :(得分:55)

我认为你的日期格式没有意义。没有下午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”。

答案 1 :(得分: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");

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

答案 2 :(得分:2)

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

答案 3 :(得分:0)

java.time

在2010年,java.util.Date是我们所有人都使用的类(与DateFormatCalendar一起使用),这些类的设计总是很差,现在已经过时了。今天,人们将使用现代Java日期和时间API java.time。

        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是一天中的某个小时,从{{1 }}是多余的。不过,它不会造成任何伤害,而且我无法复制您报告的确切结果。无论如何,无论您使用的是老式的aaa还是现代的SimpleDateFormat,您的评论都是如此:

  

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

小写DateTimeFormatter在上午或下午的1到12点之间持续一个小时,因此需要使用AM / PM标记。

其他提示

  • 在您的数据库中,由于我了解SQLite没有内置的日期时间类型,因此请使用标准的ISO 8601格式并将时间存储在UTC中,例如hh(现代的2010-04-29T07:30:14Z类将此类字符串解析并格式化为默认字符串,即没有任何显式格式化程序)。
  • 请勿在时区使用Instant这样的偏移量。首选实时区域,例如亚洲/科伦坡,亚洲/加尔各答或美国/纽约。
  • 如果您想使用过时的GMT+05:30,则其DateFormat方法将返回parse,因此您无需在Date中进行强制转换。

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

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

  • 在Java 8和更高版本以及更新的Android设备(API级别26以上)中,内置了现代API。
  • 在Java 6和7中,获得了ThreeTen反向端口,这是现代类的反向端口(JSR 310的ThreeTen;请参见底部的链接)。
  • 在(较旧的)Android上,使用Android版本的ThreeTen Backport。叫做ThreeTenABP。并确保您使用子包从Date lNextDate = (Date)lFormatter.parse(lNextDate);导入日期和时间类。

链接