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 );