如何解析日期从GMT时区到IST时区,反之亦然在android



我正在做一个项目,从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

请注意, XXx模式从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转换为StringDateFormat本身有一些用于创建的工厂方法,或者如果你想指定一个特定的模式,你可以使用SimpleDateFormat

正如Abu所说,Joda Time 是一个比内置的日期/时间API好得多的日期/时间API,尽管标准库在格式化日期/时间方面做得还不错。请注意,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看作是InstantZoneOffset

Instant instant = odt.toInstant();  // UTC.

调用toString时,以标准ISO 8601格式生成String对象。后面的ZZulu的缩写,表示UTC。

instant.toString(): 2013 - 01 - 09年t14:02:49.103z

Instant在许多方面受到限制,例如在生成各种格式的字符串时。因此,您可能希望使用调整为UTC的OffsetDateTime作为其偏移量;换句话说,就是零偏移。ZoneOffset类为UTC保存了一个常量ZoneOffset.UTC

OffsetDateTime odtUtc = odt.withOffsetSameInstant( ZoneOffset.UTC );

您还可以对Instant应用偏移量(或时区)。呼叫atOffsetatZone

Instant类是java.time的基本构建块类。在代码中经常使用的最佳实践是在UTC中完成大部分工作。

OffsetDateTime odt = instant.atOffset( ZoneOffset.ofHoursMinutes( 5 , 30 ) );
<标题>时区h1> 注意,从utc的偏移量是而不是一个时区。时区是一个偏移量加上一组过去和现在的规则,用于处理诸如夏令时(DST)之类的异常情况。因此,如果您确实确定正确的时区,那么时区总是比仅仅的偏移量更好。

请指定正确的时区名称,格式为continent/region,如America/MontrealAfrica/CasablancaPacific/Auckland。不要使用3-4个字母的缩写,如ESTIST,因为它们是而不是真正的时区,不是标准化的,甚至不是唯一的(!)。

如果您知道预期的时区,则应用ZoneId来获得ZonedDateTime对象。但千万不要在没有验证输入数据来源的情况下假设。许多不同的区域可能共享一个特定的偏移量。例如,在我们这里输入的情况下,偏移量+05:30恰好在印度(Asia/Kolkata)和斯里兰卡(Asia/Colombo)都被使用。对于过去、现在或将来的不同异常,这两个时区可能有不同的规则。

ZoneId z = ZoneId.of( "Asia/Kolkata" );
ZonedDateTime zdt = odt.atZoneSameInstant( z );

ZonedDateTimetoString方法以一种明智的方式扩展了标准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 8SE 9及以后版本
    • 内置。
    • 标准Java API的一部分,捆绑实现。
  • Java 9增加了一些小的特性和修复。
  • Java SE 6SE 7
    • 大部分java。时间功能向后移植到Java 6;7在 ThreeTen-Backport
  • Android
    • ThreeTenABP项目适应ThreeTen-Backport(上面提到的)Android。
  • 参见如何使用…
  • three - ten - extra项目扩展了java。有额外课程的时间。这个项目是将来可能添加到java.time的试验场。您可以在这里找到一些有用的类,如IntervalYearWeekYearQuarter等。

    您可以简单地通过使用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()); 
    

    相关内容

    • 没有找到相关文章

    最新更新