我正在做一个项目,从IST
(印度标准时间)的后端获取日期/时间,如"2013-01-09T19:32:49.103+05:30"
所示。但是,当我使用以下DateFormat
DateFormat sdf = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSZ");
后接解析…
Date date = sdf.parse("2013-01-09T19:32:49.103+05:30");
System.out.println("XYZ ==============>"+date);
以GMT格式显示日期作为输出,即
Wed Jan 09 14:02:49 GMT+00:00 2013.
我已经尝试使用TimeZone类作为…
TimeZone timeZone=TimeZone.getTimeZone("IST");
sdf.setTimeZone(timeZone);
but no effect.
我怎么能得到一个Date
类对象的日期在IST
格式而不是GMT…
请提供合适的解决方案。
编辑:这就是代码的样子:
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSZ");
TimeZone timeZone=TimeZone.getTimeZone("IST");
sdf.setTimeZone(timeZone);
Date date = sdf.parse("2013-01-09T19:32:49.103+05:30");
String formattedDate=sdf.format(date);
System.out.println("XYZ ==============>"+formattedDate);
Date没有时区。它只是一个自1970年1月1日00:00:00 GMT以来的毫秒数的持有者。使用您用于解析的相同DateFormat,设置IST时区并按照以下示例设置日期格式
DateFormat sdf = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSXXX");
Date date = sdf.parse("2013-01-09T19:32:49.103+05:30");
sdf.setTimeZone(TimeZone.getTimeZone("IST"));
System.out.println(sdf.format(date));
输出2013-01-09T19:32:49.103+05:30
请注意, XX
x模式从1.7开始用于ISO 8601时区(-08:00)。如果你是在1.6尝试Z
。查看SimpleDateFormat API获取格式模式的详细信息
我怎么能得到一个日期类对象在IST格式的日期,而不是GMT…
你不能。Date
没有格式或时区。它只是表示从Unix纪元1970年1月1日UTC午夜开始的毫秒数。相反,Date.toString()
总是使用默认时区。
若要使用特定的格式和时区,请使用DateFormat
而不是Date.toString()
。您可以使用DateFormat.setTimeZone()
设置时区,然后使用DateFormat.format()
将Date
转换为String
。DateFormat
本身有一些用于创建的工厂方法,或者如果你想指定一个特定的模式,你可以使用SimpleDateFormat
。
DateFormat
和它的子类通常是不是线程安全的。br
OffsetDateTime.parse( "2013-01-09T19:32:49.103+05:30" ) // Parsed.
.toInstant() // Adjusted to UTC.
查看IdeOne.com中的实时代码。
<标题> ISO 8601 h1> 的2013-01-09T19:32:49.103+05:30
的输入字符串恰好是标准的ISO 8601格式。结尾的+05:30
表示比utc早五个半小时的偏移量,在印度使用。
<标题> java.time h1> 正在使用麻烦的旧日期时间类,现在是遗留的,由java取代。时间类。java。time类在解析/生成表示日期-时间值的字符串时默认使用ISO 8601格式。所以根本不需要指定格式化模式。
由于你的输入代表了时间轴上与utc偏移的时刻,我们将其解析为OffsetDateTime
对象。
OffsetDateTime odt = OffsetDateTime.parse( "2013-01-09T19:32:49.103+05:30" );
odt.toString(): 2013 - 01 - 09年t19:32:49.103 + 05:30
获取一个简单对象的UTC值,提取一个Instant
。这个Instant
类是java.time的一个基本构建块类。Instant
类表示UTC时间轴上的时刻,分辨率为纳秒(最多九(9)位小数)。
你可以把OffsetDateTime
看作是Instant
加ZoneOffset
。
Instant instant = odt.toInstant(); // UTC.
调用toString
时,以标准ISO 8601格式生成String
对象。后面的Z
是Zulu
的缩写,表示UTC。
instant.toString(): 2013 - 01 - 09年t14:02:49.103z
Instant
在许多方面受到限制,例如在生成各种格式的字符串时。因此,您可能希望使用调整为UTC的OffsetDateTime
作为其偏移量;换句话说,就是零偏移。ZoneOffset
类为UTC保存了一个常量ZoneOffset.UTC
。
OffsetDateTime odtUtc = odt.withOffsetSameInstant( ZoneOffset.UTC );
您还可以对Instant
应用偏移量(或时区)。呼叫atOffset
或atZone
Instant
类是java.time的基本构建块类。在代码中经常使用的最佳实践是在UTC中完成大部分工作。
OffsetDateTime odt = instant.atOffset( ZoneOffset.ofHoursMinutes( 5 , 30 ) );
<标题>时区h1> 注意,从utc的偏移量是而不是一个时区。时区是一个偏移量加上一组过去和现在的规则,用于处理诸如夏令时(DST)之类的异常情况。因此,如果您确实确定正确的时区,那么时区总是比仅仅的偏移量更好。
请指定正确的时区名称,格式为continent/region
,如America/Montreal
、Africa/Casablanca
、Pacific/Auckland
。不要使用3-4个字母的缩写,如EST
或IST
,因为它们是而不是真正的时区,不是标准化的,甚至不是唯一的(!)。
如果您知道预期的时区,则应用ZoneId
来获得ZonedDateTime
对象。但千万不要在没有验证输入数据来源的情况下假设。许多不同的区域可能共享一个特定的偏移量。例如,在我们这里输入的情况下,偏移量+05:30
恰好在印度(Asia/Kolkata
)和斯里兰卡(Asia/Colombo
)都被使用。对于过去、现在或将来的不同异常,这两个时区可能有不同的规则。
ZoneId z = ZoneId.of( "Asia/Kolkata" );
ZonedDateTime zdt = odt.atZoneSameInstant( z );
ZonedDateTime
的toString
方法以一种明智的方式扩展了标准ISO 8601格式,将时区名称附加在方括号中。在本例中,[Asia/Kolkata]
.
zdt.toString(): 2013 - 01 - 09年t19:32:49.103 + 05:30[亚洲/加尔各答]
关于java.time
java。时间框架内置于Java 8及以后版本中。这些类取代了麻烦的旧的遗留日期时间类,如java.util.Date
, Calendar
, &SimpleDateFormat
.
Joda-Time项目,现在处于维护模式,建议迁移到java.time.
要了解更多信息,请参阅Oracle教程。并搜索Stack Overflow以获得许多示例和解释。规格为JSR 310。
从哪里获取java。时间类?
- Java SE 8和SE 9及以后版本
- 内置。
- 标准Java API的一部分,捆绑实现。
Java 9增加了一些小的特性和修复。
- 大部分java。时间功能向后移植到Java 6;7在 ThreeTen-Backport 。
- ThreeTenABP项目适应ThreeTen-Backport(上面提到的)Android。
three - ten - extra项目扩展了java。有额外课程的时间。这个项目是将来可能添加到java.time的试验场。您可以在这里找到一些有用的类,如Interval
、YearWeek
、YearQuarter
等。
您可以简单地通过使用calendar类来做到这一点。请检查下面的代码片段:
Calendar calendar = Calendar.getInstance();
calendar.setTimeZone(TimeZone.getTimeZone("GMT"));
calendar.setTimeInMillis(<--time stamp-->);
//calendar.setTime(<--date object of gmt date-->);
SimpleDateFormat sdf = new SimpleDateFormat("MMM dd, yyyy 'at' hh:mm a");
sdf.setTimeZone(TimeZone.getDefault());
String result=sdf.format(calendar.getTime());