时区格式的Java Datetime(从时区到未知本地)

时区格式的Java Datetime(从时区到未知本地),java,date,Java,Date,我想转换成: 2018-06-04T21:00:00.000-07:00 这是给 2018-06-05哪个是正确时区的日期(我不知道正确的时区是什么,只有-07:00)。试试这个 String date = "2018-06-04T21:00:00.000-07:00"; SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSXXX"); Syst

我想转换成: 2018-06-04T21:00:00.000-07:00 这是给 2018-06-05哪个是正确时区的日期(我不知道正确的时区是什么,只有-07:00)。试试这个

        String date = "2018-06-04T21:00:00.000-07:00";
        SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSXXX"); 
        System.out.println(dateFormat.parseObject(date));

如果您使用的是Java8,那么可以使用
ZoneDateTime
类,如下所示:

String d = "2018-06-04T21:00:00.000-07:00";

DateTimeFormatter parser = DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm:ss.SSSXXX");

ZonedDateTime zonedDateTime = ZonedDateTime.parse(d, parser);

// Convert here to any other timezone you want...
System.out.println(zonedDateTime.withZoneSameInstant(ZoneOffset.UTC));

当你不知道正确的时区时,这是不可能的

像您这样的字符串符合ISO 8601格式的偏移日期时间,即具有UTC偏移的日期和时间(但不带时区)。因此,唯一自然的做法是将其解析为
OffsetDateTime

    String dateTimeString = "2018-03-04T03:45:00.000-07:00";
    OffsetDateTime dateTime = OffsetDateTime.parse(dateTimeString);
    System.out.println(dateTime);
输出:

2018-03-05
2018-03-03
2018-03-04
2018-03-04T03:45-07:00

解析在没有任何显式格式化程序的情况下工作,因为
OffsetDateTime
java.time
的其他日期时间类将ISO 8601格式解析为其默认格式(并以其
toString
方法打印ISO 8601)
java.time
是现代的java日期和时间API。(我故意选择了与你不同的日期和时间来阐述我的下一点。)

要将其转换为日期,时区至关重要。让我们尝试使用三个不同的时区:

    System.out.println(dateTime.atZoneSameInstant(ZoneId.of("Pacific/Apia")).toLocalDate());
    System.out.println(dateTime.atZoneSameInstant(ZoneId.of("Pacific/Pago_Pago")).toLocalDate());
    System.out.println(dateTime.atZoneSameInstant(ZoneId.of("Asia/Kamchatka")).toLocalDate());
输出:

2018-03-05
2018-03-03
2018-03-04
我们有三个不同的日期,3月3日,4日和5日。因为地球上任何地方的日期都不一样。做出你的选择。:-)

可能可以使用JVM的时区设置。如果是这样,请使用
ZoneId.systemDefault()
作为
atzonesamainstant()
的参数。不过,时区设置可以随时从程序的另一部分或运行在同一JVM中的另一个程序更改

问题:我可以在Java7中使用java.time吗? 是的,
java.time
至少需要Java6

  • 在Java8和更高版本中,以及在新的Android设备上(听说是API级别26),新的API是内置的
  • 在Java6和Java7中,获取三个后端口,即新类的后端口(三个用于JSR310,其中最早描述了现代API)
  • 在(较旧的)Android上,使用Android版的ThreeTen Backport。它叫ThreeTenABP。确保从package
    org.threeten.bp
    和子package导入日期和时间类
链接
  • ,解释如何使用
    java.time
  • ,Android版Three Ten Backport
  • ,解释得非常透彻

添加源代码
正确时区的日期
那是哪个时区?(您的目标时区,而不是-07:00)没有什么要添加的,不知道如何实现这一点您使用的是日期类还是字符串?我得到了这个2018-06-04T21:00:00.000-07:00作为字符串不幸的是,我需要java 7来实现这一点,这确实是非常不幸的:)。还有Joda,它可以在Java7中使用。没什么大问题,@pshemek。将
java.time
功能(最初在Java8中引入)向后移植到Java6和Java7。所以,获取该库并将其添加到您的项目中,您就一切都好了。我热烈推荐。好的,我不知道那个项目。我过去总是用乔达。。。但那是很久以前的事了!:)请不要教年轻人使用早已过时且臭名昭著的简化格式课程。至少不是第一个选择。而且不是毫无保留的。今天,我们在及其
DateTimeFormatter
中有了更好的功能。