Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/198.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 如何在android中解析从GMT时区到IST时区以及从IST时区到GMT时区的日期_Java_Android_Date_Timezone_Simpledateformat - Fatal编程技术网

Java 如何在android中解析从GMT时区到IST时区以及从IST时区到GMT时区的日期

Java 如何在android中解析从GMT时区到IST时区以及从IST时区到GMT时区的日期,java,android,date,timezone,simpledateformat,Java,Android,Date,Timezone,Simpledateformat,我正在从事一个项目,该项目在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(

我正在从事一个项目,该项目在
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.getTimeZone("IST");
sdf.setTimeZone(timeZone);
但是没有效果

我怎样才能得到一个日期为
IST
格式的
Date
类对象,而不是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);
我怎样才能得到一个日期类对象,它的日期是IST格式而不是GMT

你不能<代码>日期没有格式或时区。它只是表示自1970年1月1日UTC午夜Unix纪元以来的毫秒数。相反,始终使用默认时区

要使用特定格式和时区,请使用而不是
Date.toString()
。您可以使用设置时区,然后使用将
日期
转换为
字符串
DateFormat
本身有一些用于创建的工厂方法,如果您想指定特定的模式,也可以使用这些方法


正如Abu所说,与内置API相比,它是一个更好的日期/时间API,尽管对于格式化日期/时间而言,标准库的工作并不差。请注意,
DateFormat
及其子类通常不是线程安全的。

Date没有任何时区。它只是自1970年1月1日00:00:00 GMT以来的毫秒数的持有者。采用与解析时相同的日期格式,设置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
。有关格式模式的详细信息,请参见SimpleDataFormat API

您只需使用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()); 
Calendar Calendar=Calendar.getInstance();
calendar.setTimeZone(TimeZone.getTimeZone(“GMT”));
calendar.setTimeInMillis();
//calendar.setTime();
SimpleDataFormat sdf=新的SimpleDataFormat(“年月日,yyyy”在“hh:mm a”);
setTimeZone(TimeZone.getDefault());
字符串结果=sdf.format(calendar.getTime());
tl;博士 看

ISO 8601 您输入的
2013-01-09T19:32:49.103+05:30
字符串恰好是标准ISO 8601格式。结尾处的
+05:30
表示提前五个半小时到达,在印度使用

java.time 您使用的是麻烦的旧日期时间类,现在是遗留的,被java.time类取代

在解析/生成表示日期时间值的字符串时,java.time类默认使用ISO 8601格式。所以根本不需要指定格式化模式

由于您的输入表示时间线上某个时刻与UTC的偏移量,因此我们将其解析为一个对象

odt.toString():2013-01-09T19:32:49.103+05:30

要获取值中的简单对象,请提取一个
瞬间
。这个
Instant
类是java.time的基本构建块类。该类表示时间线上的一个时刻,分辨率为(小数点的九(9)位)

您可以将其视为一个
即时
加上一个

调用
toString
时,将以标准ISO 8601格式生成
String
对象。末尾的
Z
Zulu
的缩写,表示UTC

instant.toString():2013-01-09T14:02:49.103Z

即时
以各种方式受到限制,例如在生成各种格式的字符串时。因此,您可能希望使用调整为的
OffsetDateTime
作为其偏移量;换句话说,偏移量为零。
ZoneOffset
类保持UTC的常量

您还可以将偏移量(或时区)应用于
即时
。呼叫或
atZone

Instant
类是java.time的基本构建块类。可能经常在代码中使用,因为最佳做法是在UTC中完成大部分工作

OffsetDateTime odt = instant.atOffset( ZoneOffset.ofHoursMinutes( 5 , 30 ) );
时区 请注意,与UTC的偏移不是时区。时区是一个偏移量加上一组过去和现在的规则,用于处理异常,例如。因此,如果你确实确定了正确的时区,那么时区总是比单纯的偏移更可取

大陆/地区
的格式指定,例如,或
太平洋/奥克兰
。切勿使用3-4个字母的缩写,如
EST
IST
,因为它们不是真正的时区,也不是标准化的,甚至不是唯一的(!)

如果您知道预期的时区,请应用
ZoneId
以获取
zoneDateTime
对象。但是,在没有验证输入数据来源的情况下,千万不要假设。许多不同的分区可能共享一个特定偏移。例如,在我们这里输入的情况下,偏移量
+05:30
今天碰巧在印度(
亚洲/加尔各答
)和斯里兰卡(
亚洲/科伦坡
)使用。这两个时区对于过去、现在或未来的不同异常可能有不同的规则

ZoneId z = ZoneId.of( "Asia/Kolkata" );
ZonedDateTime zdt = odt.atZoneSameInstant( z );
ZonedDateTime
toString
方法以一种明智的方式扩展了标准ISO 8601格式,将时区名称添加到方括号中。在这种情况下,
[Asia/Kolkata]

托斯特林():2013-01-09T19:32:49.103+05:30[亚洲/加尔各答]


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

该项目现已启动,建议迁移到java.time

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

从哪里获得java.time类

Instant instant = odt.toInstant();  // UTC.
OffsetDateTime odtUtc = odt.withOffsetSameInstant( ZoneOffset.UTC );
OffsetDateTime odt = instant.atOffset( ZoneOffset.ofHoursMinutes( 5 , 30 ) );
ZoneId z = ZoneId.of( "Asia/Kolkata" );
ZonedDateTime zdt = odt.atZoneSameInstant( z );