【问题标题】:Convert String to java.util.Date将字符串转换为 java.util.Date
【发布时间】:2011-02-13 16:03:45
【问题描述】:

我以这种格式将日期存储在 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);

我做错了什么?

【问题讨论】:

  • 好的哥们 问题解决了,AM/PM“字母aaa”格式的问题,因为我使用'HH',不应该使用'aaa',如果你使用'aaa'然后指定'hh'
  • 在 2010 年,java.util.Date 是我们都使用的类(连同 DateFormatCalendar),对于 2017 年或更晚出现的任何人来说,这些类现在早已过时了。今天人们会使用java.time 包中的类,例如LocalDateTimeDateTimeFormatter。 Stack Overflow 上有很多答案可以告诉你如何做。去搜索。

标签: java date datetime-format


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    听起来您可能想要使用 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");
    

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

    【讨论】:

    • 不相关但 DateFormat 对象不是线程安全的,它们不应该被声明为静态的,因为它更有可能在某些时候从不同的线程访问它们。
    【解决方案3】:

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

    【讨论】:

    • 我以字母z的格式指定了时区,问题仍然存在
    • 您的日期字符串没有时区信息,因此 z 字母无济于事,请在 SimpleDateFormat 对象上使用 setTimeZone(...)
    【解决方案4】:

    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 是一天中的一个小时,从而使aaa 中的AM/PM 标记变得多余。不过,它不应该造成任何伤害,而且我无法重现您报告的确切结果。无论如何,无论使用老式的SimpleDateFormat 还是现代的DateTimeFormatter,您的评论都是中肯的:

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

    小写 hh 表示上午或下午的小时,从 01 到 12,因此需要 AM/PM 标记。

    其他提示

    • 在您的数据库中,由于我了解 SQLite 没有内置日期时间类型,因此请使用标准 ISO 8601 格式并以 UTC 存储时间,例如 2010-04-29T07:30:14Z(现代 Instant 类解析和格式此类字符串作为其默认值,即没有任何显式格式化程序)。
    • 不要使用诸如GMT+05:30 之类的偏移量作为时区。首选实时时区,例如 Asia/Colombo、Asia/Kolkata 或 America/New_York。
    • 如果你想使用过时的DateFormat,它的parse方法返回一个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,这是现代类的后向端口(JSR 310 的 ThreeTen;请参阅底部的链接)。
    • 在(较旧的)Android 上使用 ThreeTen Backport 的 Android 版本。它被称为 ThreeTenABP。并确保从 org.threeten.bp 导入日期和时间类以及子包。

    链接

    【讨论】:

      猜你喜欢
      • 2011-08-06
      • 1970-01-01
      • 1970-01-01
      • 2011-01-13
      • 2015-05-21
      • 2012-11-02
      • 1970-01-01
      相关资源
      最近更新 更多