Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/356.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/date/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java DateFormat格式方法不支持';t显示特定时区的解析日期_Java_Date_Datetime_Time - Fatal编程技术网

Java DateFormat格式方法不支持';t显示特定时区的解析日期

Java DateFormat格式方法不支持';t显示特定时区的解析日期,java,date,datetime,time,Java,Date,Datetime,Time,我使用SimpleDataFormat(“yyyy-MM-dd'T'HH:MM:ssZ”)将日期字符串转换为日期。parse(DateinString)。 这里不是转换为UTC,而是转换为我的本地时区。我通过DateFormat的format方法显示这个解析的日期来检查它 因此,我必须将其重新格式化为UTC。现在,当我试图通过相同的格式化方法将解析后的日期显示为UTC时区时,它仍然显示在本地时区。以下是我将解析的日期格式化为UTC的代码- Calendar cal = Calendar.getI

我使用SimpleDataFormat(“yyyy-MM-dd'T'HH:MM:ssZ”)将日期字符串转换为日期。parse(DateinString)。
这里不是转换为UTC,而是转换为我的本地时区。我通过DateFormat的format方法显示这个解析的日期来检查它

因此,我必须将其重新格式化为UTC。现在,当我试图通过相同的格式化方法将解析后的日期显示为UTC时区时,它仍然显示在本地时区。以下是我将解析的日期格式化为UTC的代码-

Calendar cal = Calendar.getInstance();
cal.setTimeZone(TimeZone.getTimeZone("UTC"));
cal.setTime(alreadyParsedDateTime); // 
System.out.println(new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss").format(cal.getTime()));       
我的示例日期字符串是“2015-12-23T15:00:00-0800”
解析后--alreadyParsedDateTime.toString():Thu Dec 24 04:30:00 IST 2015
解析后-- System.out.println(新简化格式(“yyyy-MM-dd'T'HH:MM:ss”)。格式(alreadyParsedDateTime))::2015-12-24T04:30:00

在上述将解析日期重新格式化为UTC之后-- System.out.println(新的SimpleDataFormat(“yyyy-MM-dd'T'HH:MM:ss”).格式(cal.getTime())::2015-12-24T04:30:00

预计日期格式为:2015-12-23T23:00:00


我不知道为什么格式化方法不能以预期的方式工作,或者有任何技巧可以做到这一点。请帮忙。

这里有两个不同的主题;解析和格式化

1.解析
SimpleDataFormat.parse()
将尝试从提供的日期字符串解析时区。如果正在分析的日期字符串不包含显式时区,则将使用
SimpleDateFormat
对象上的“默认”时区。您可以使用
setTimeZone()
方法设置默认时区。请参阅API文档以获取和参考

以下示例显示了使用
setTimeZone()
设置的时区如何影响解析:

2.格式化 假设已正确解析日期,则问题在于格式。您需要为用于格式化的实际
SimpleDataFormat
对象设置时区。我修改了您的代码以执行此操作,现在它将打印您的体验:

    Calendar cal = Calendar.getInstance();
    cal.setTime(alreadyParsedDateTime);
    SimpleDateFormat sdf3 = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss");
    sdf3.setTimeZone(TimeZone.getTimeZone("UTC"));

    // Prints: 2015-12-23T23:00:00 for your example date string
    System.out.println(sdf3.format(cal.getTime()));
tl;博士 当前时刻(UTC)

Instant.now()        // Capture current moment in UTC.
    .toString()      // Generate string in standard ISO 8601 format.
2018-02-11T22:13:28.650328Z

调整到另一个时区

instant.atZone(      // Apply a `ZoneId` to `Instant` object to get a `ZonedDateTime` object.
    ZoneId.of( "Pacific/Auckland" )
).toString()
2018-02-12T11:13:28.650328+13:00[太平洋/奥克兰]

或者直接将当前时刻捕捉到该区域

ZonedDateTime.now(   // Capture current moment as seen on the wall-clock time of the people in a particular region.
    ZoneId.of( "Pacific/Auckland" )
).toString()         // Generate string in standard ISO 8601 format, wisely extended by appending the name of the time zone in square brackets.
2018-02-12T11:13:28.650328+13:00[太平洋/奥克兰]

细节 这是正确的,但已经过时了

java.time 现代方法使用java.time类来取代麻烦的旧遗留日期时间类

您的输入字符串符合格式标准。默认情况下,java.time类在解析/生成字符串时使用这些格式。因此,无需指定格式化模式

该类表示时间线上的一个时刻,分辨率为(小数点的九(9)位)

捕捉当前时刻

要通过另一个地区(时区)的人们使用的挂钟时间的镜头来查看同一个同时发生的时刻,请应用a来获取对象

请注意,我们在这里使用的是智能对象,而不是哑字符串。不要将日期时间对象与可能以文本形式表示其值的字符串混为一谈

如果要生成标准格式的字符串,请调用
toString
方法

String outputA = instant.toString() ;
String outputB = zdt.toString() ;
要生成其他格式的字符串,请使用或
DateTimeFormatterBuilder
类。关于堆栈溢出,这两个方面都有详细的介绍,所以请搜索更多信息


关于java.time 该框架内置于Java8及更高版本中。这些类取代了麻烦的旧日期时间类,例如,&

该项目现已启动,建议迁移到类

要了解更多信息,请参阅。并搜索堆栈溢出以获得许多示例和解释。规格是

使用符合或更高版本的,您可以直接与数据库交换java.time对象。不需要字符串或java.sql.*类

从哪里获得java.time类

  • ,及以后
    • 内置的
    • 标准JavaAPI的一部分,带有捆绑实现
    • Java9添加了一些次要功能和修复
    • 大部分java.time功能都在中向后移植到Java6和Java7
    • 更高版本的Android捆绑包实现了java.time类
    • 对于早期的Android,该项目采用了ThreeTen Backport(如上所述)。看

该项目使用其他类扩展了java.time。这个项目是java.time将来可能添加的一个试验场。您可以在这里找到一些有用的类,如、、。

查看
DateFormat
setTimeZone()
方法(从而
SimpleDateFormat
)。仅供参考,像和
java.text.SimpleDateFormat
这样麻烦的旧日期时间类现在被内置在java 8和java 9中的类所取代。看,我已经试过了,但是没有结果。SimpleDateFormat dateTimeFormat=新的SimpleDateFormat(“yyyy-MM-dd'T'HH:MM:ssZ”);dateTimeFormat.setTimeZone(TimeZone.getTimeZone(“UTC”);是的,您的示例是正确的,但是这里我的dateString(“2015-12-23T15:00:00-0800”)也包含时区,这就是为什么setTimeZone可能不起作用的原因。在这里,我用SimpleDataFormat(“yyyy-MM-dd'T'HH:MM:ssZ”)解析这个日期字符串。非常感谢,它现在可以工作了。你救了我一天!:-)答案很好,但是……仅供参考,像、
java.text.simpleDataFormat
这样麻烦的旧日期时间类现在被内置在Java8和Java9中的类所取代。请参阅。@BasilBourque新的java.time类非常好,但是API文档中没有官方声明说
java.util.Calendar
java.util.SimpleDataFormat
等是“遗留的”(它们没有被标记为不推荐的,也没有被标记为不推荐的)
Instant instant = Instant.now() ;  // Current moment in UTC.
ZoneId z = ZoneId.of( "Asia/Kolkata" ) ;
ZonedDateTime zdt = instant.atZone( z ) ;
String outputA = instant.toString() ;
String outputB = zdt.toString() ;