【问题标题】:Java String to DateTimeJava 字符串到日期时间
【发布时间】:2013-09-20 08:15:06
【问题描述】:

我有一个来自 json 响应的字符串:

start: "2013-09-18T20:40:00+0000",
end: "2013-09-18T21:39:00+0000",

如何将此字符串转换为 java DateTime 对象?

我尝试过使用以下方法:

SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSXXX");
start = sdf.parse("2013-09-18T20:40:00+0000");

但是这样我只能创建一个日期对象。但是String中绑定的时间有点重要。

非常感谢任何帮助!

【问题讨论】:

  • Date也有时间信息。
  • 好的,但我仍然需要它是一个 DateTime 对象:)
  • Java 没有 DateTime 类。使用Date
  • 你说的是java api还是joda time api?
  • 仅供参考,麻烦的旧日期时间类,如 java.util.Datejava.util.Calendarjava.text.SimpleDateFormat 现在是 legacy,被 Java 8 及更高版本中内置的 java.time 类所取代.见Tutorial by Oracle

标签: java datetime


【解决方案1】:

你试过了吗?

Date date1=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").parse("2013-09-18T20:40:00+0000".replace("T"," ").substring(0,19));

【讨论】:

    【解决方案2】:

    java.time

    我建议您使用现代 Java 日期和时间 API java.time 进行日期和时间工作。

        String startStr = "2013-09-18T20:40:00+0000";
        OffsetDateTime start = OffsetDateTime.parse(startStr, isoFormatter);
        System.out.println(start);
    

    输出是:

    2013-09-18T20:40Z

    我正在使用这个格式化程序:

    private static final DateTimeFormatter isoFormatter = new DateTimeFormatterBuilder()
            .append(DateTimeFormatter.ISO_LOCAL_DATE_TIME)
            .appendOffset("+HHMM", "+0000")
            .toFormatter();
    

    如果DateTime 对象是指org.joda.time.Datetime,请阅读 Joda-Time 主页上的这段引文(粗体字为原文):

    请注意,从 Java SE 8 开始,用户被要求迁移到 java.time (JSR-310) - JDK 的核心部分,它取代了这个 项目。

    您在问题中尝试使用的SimpleDateFormat 类是一个臭名昭著的类麻烦制造者,并且早已过时。在任何情况下都不要使用它。永远。

    链接

    【讨论】:

      【解决方案3】:

      您可以从 Java Date 对象创建 Joda DateTime 对象,因为 Java 没有 DateTime 类。

      DateTime dt = new DateTime(start.getTime());
      

      虽然 Java 的 Date 类也保存了时间信息(这是您首先需要的),但我建议您使用 Calendar 而不是 Java 的 Date 类。

      Calendar myCal = new GregorianCalendar();
      myCal.setTime(date);
      

      查看Calendar 文档,了解有关如何更有效地使用它的更多信息。


      情况发生了变化,现在甚至 Java(准确地说是 Java 8)也有了 LocalDateTimeZonedDateTime 类。对于转换,您可以查看此SO answer(从那里发布摘录)。

      给定:Date date = [some date]

      (1) LocalDateTime

      Instant instant = Instant.ofEpochMilli(date.getTime());
      LocalDateTime ldt = LocalDateTime.ofInstant(instant, ZoneOffset.UTC);
      

      (2) 日期

      Instant instant = ldt.toInstant(ZoneOffset.UTC);
      Date date = Date.from(instant);
      

      【讨论】:

      • +1 用于 Joda - 这是一个比基本 Java 更好的日期实现
      • @RJ 你的链接指向错误的Date,它是java.util.Date,而不是java.sql.Date :)
      • LocalDateTime 是此处使用的错误类型。您将丢弃宝贵的时区或与 UTC 的偏移量信息。如果您想查看其他地区挂钟时间的Instant,请使用ZonedDateTime
      【解决方案4】:

      您不需要DateTime 对象。 java.util.Date也存储时间。

      int hours = start.getHours(); //returns the hours
      int minutes = start.getMinutes(); //returns the minutes
      int seconds = start.getSeconds(); //returns the seconds
      

      正如 R.J 所说,这些方法已被弃用,因此您可以使用 java.util.Calendar 类:

      Calendar calendar = Calendar.getInstance();
      calendar.setTime(sdf.parse("2013-09-18T20:40:00+0000"));
      int hour = calendar.get(Calendar.HOUR); //returns the hour
      int minute = calendar.get(Calendar.MINUTE); //returns the minute
      int second = calendar.get(Calendar.SECOND); //returns the second
      

      注意:在我这边,sdf.parse("2013-09-18T20:40:00+0000") 会触发

      java.text.ParseException: Unparseable date: "2013-09-18T20:40:00+0000"
          at java.text.DateFormat.parse(DateFormat.java:357)
          at MainClass.main(MainClass.java:16)
      

      【讨论】:

        【解决方案5】:

        你可以使用DateTimeFormatter

        DateTimeFormatter format = DateTimeFormat.forPattern("yyyy-MM-dd'T'HH:mm:ss.SSSXXX");
        DateTime time = format.parseDateTime("2013-09-18T20:40:00+0000");
        

        【讨论】:

        • 从 Android O 开始就提供此支持
        • 不,@PrasadGKulkarni,这是 Joda-Time,一个外部库,也适用于早期的 Android 版本。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-04-02
        • 1970-01-01
        • 2014-02-21
        • 1970-01-01
        相关资源
        最近更新 更多