Java字符串转换为日期时间

18

我有一个来自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");

但是使用这种方法我只能创建一个日期对象。但是字符串中绑定的时间是非常重要的。任何帮助都将不胜感激!

5
Date 也包含时间信息。 - user1907906
1
好的,但我仍然需要它成为一个DateTime对象 :) - sn0ep
4
JavaжІЎжњ‰DateTimeз±»пјЊеє”дЅїз”ЁDateгЂ‚ - user1907906
3
你是在谈论Java API还是Joda Time API? - Thihara
1
请注意,像java.util.Datejava.util.Calendarjava.text.SimpleDateFormat这样的老旧日期时间类现在已经成为遗留系统,被内置于Java 8及更高版本中的java.time类所取代。请参阅Oracle的教程 - Basil Bourque
类似于Java 6中的对ISO 8601格式的通用支持 - Ole V.V.
5个回答

9

您不需要一个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)

7

由于Java没有DateTime类,所以您可以从Java Date对象创建Joda 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答案(摘录自其中)。
给定:Date date = [some date] (1) LocalDateTime << Instant<< Date

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日期实现要好得多。 - Guillaume
1
@RJ,你的链接指向了错误的“Date”,应该是java.util.Date而不是java.sql.Date :) - BackSlash
在这里使用 LocalDateTime 是错误的类型。你将会丢失有价值的时区或偏移量信息。当你想要查看另一个地区的壁钟时间中的 Instant 时,请使用 ZonedDateTime - Basil Bourque

5

您可以使用DateTimeFormatter来进行时间格式化。

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

1
这种支持从Android O开始就存在。 - Prasad G Kulkarni
不是,@PrasadGKulkarni,它是Joda-Time,一个外部库,也可以很好地与早期的Android版本一起使用。 - Ole V.V.

0

java.time

我建议您使用java.time,这是现代Java日期和时间API,用于处理日期和时间。
    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 类是一个臭名昭著的麻烦制造者,并且已经过时。绝不要使用它。永远不要。

链接


0

你试过这个吗?

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

不必要的替换函数 - rushabh shah

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接