Java 将CST时区转换为所需的时区
我需要将CST中的日期转换为所需时区。我将以字符串形式获取日期,如CST时区中的“11/5/2018 12:54:20”。我必须将其转换为时区,作为参数传递。假设我们将其设为“GMT+0530”。 上述日期的结果为“2018年11月6日00:24:20” 我尝试了以下代码,该代码返回的日期(11/05/2018 12:54:20)与(11/05/2018 00:24:20)相同,而不是(11/05/2018 00:24:20)。我在一个有IST时区的系统上执行了这个Java 将CST时区转换为所需的时区,java,date,simpledateformat,Java,Date,Simpledateformat,我需要将CST中的日期转换为所需时区。我将以字符串形式获取日期,如CST时区中的“11/5/2018 12:54:20”。我必须将其转换为时区,作为参数传递。假设我们将其设为“GMT+0530”。 上述日期的结果为“2018年11月6日00:24:20” 我尝试了以下代码,该代码返回的日期(11/05/2018 12:54:20)与(11/05/2018 00:24:20)相同,而不是(11/05/2018 00:24:20)。我在一个有IST时区的系统上执行了这个 SimpleDate
SimpleDateFormat sdf = new SimpleDateFormat("MM/dd/yyyy HH:mm:ss");
sdf.setTimeZone(TimeZone.getTimeZone("GMT-0600"));
SimpleDateFormat sdf2 = new SimpleDateFormat("MM/dd/yyyy HH:mm:ss");
sdf.setTimeZone(TimeZone.getTimeZone("GMT+0530"));
System.out.println(sdf2.format(sdf.parse("11/5/2018 12:54:20").getTime()));
编辑:
答复:
tl;博士
2018-05-11T22:24:20+05:30[亚洲/加尔各答]
java.time
您使用的是糟糕的旧类,现在已被java.time类取代
将输入字符串解析为LocalDateTime
,因为它没有任何与UTC或时区的偏移指示
SimpleDateFormat sdf = new SimpleDateFormat("MM/dd/yyyy HH:mm:ss");
sdf.setTimeZone(TimeZone.getTimeZone("GMT-0600"));
SimpleDateFormat sdf2 = new SimpleDateFormat("MM/dd/yyyy HH:mm:ss");
sdf.setTimeZone(TimeZone.getTimeZone("GMT+0530"));
System.out.println(sdf2.format(sdf.parse("11/5/2018 12:54:20").getTime()));
定义与输入匹配的格式模式
DateTimeFormatter f = DateTimeFormatter.ofPattern( "d/M/uuuu HH:mm:ss" ) ;
LocalDateTime ldt = LocalDateTime.parse( "11/5/2018 12:54:20" , f ) ;
ldt.toString():2018-05-11T12:54:20
您说这是为CST设计的。你是说中国标准时间吗?还是北美的中央标准时间
以大陆/地区
的格式指定,例如,或太平洋/奥克兰
。切勿使用2-4个字母的缩写,例如CST
或EST
或IST
,因为它们不是真正的时区,不是标准化的,甚至不是唯一的(!)
我猜你指的是纽约时间
ZoneId z = ZoneId.of( "America/New_York" ) ;
ZonedDateTime zdt = ldt.atZone( z ) ;
zdt.toString():2018-05-11T12:54:20-04:00[美国/纽约]
显然,你想通过不同地区、不同时区的人们使用的挂钟时间的镜头来观察同一时刻。你指的是爱尔兰标准时间吗?还是印度标准时间?同样,使用实时区域,而不是这些2-4个字符的伪区域
ZoneId zKolkata = ZoneId.of( "Asia/Kolkata" ) ;
ZonedDateTime zdtKolkata = zdt.withZoneSameInstant( zKolkata ) ;
zdtKolkata.toString():2018-05-11T22:24:20+05:30[亚洲/加尔各答]
要查看UTC中的相同时刻,请提取一个Instant
Instant instant = zdtKolkata.toInstant() ;
instant.toString():2018-05-11T16:54:20Z
所有这三个(zdt
,zdtKolkata
,instant
)都代表同一时刻,时间线上的同一点
相比之下,ldt
作为LocalDateTime
对象并不代表一个时刻,也不是时间线上的一个点。它没有真正的意义,直到你给它指定了一个时区,给它一个上下文。在指定该区域之前,我们不知道在澳大利亚、非洲或美国是指中午。这可能意味着26-27小时的任何时间,也就是全球的时区范围
ISO 8601
使用标准格式,而不是发明自己的格式将日期时间值交换为文本
默认情况下,java.time类在生成/解析字符串时方便地使用格式
关于java.time 该框架内置于Java8及更高版本中。这些类取代了麻烦的旧日期时间类,例如,& 该项目现已启动,建议迁移到类 要了解更多信息,请参阅。并搜索堆栈溢出以获得许多示例和解释。规格是 您可以直接与数据库交换java.time对象。使用兼容的或更高版本。不需要字符串,也不需要
java.sql.*
类
从哪里获得java.time类
- 、和更高版本-标准Java API的一部分,带有捆绑实现。
- Java9添加了一些次要功能和修复
- 及
- 大多数java.time功能都在中向后移植到Java6和Java7
-
- 更高版本的Android捆绑包实现了java.time类
- 对于早期的Android(tl;dr
2018-05-11T22:24:20+05:30[亚洲/加尔各答]
java.time
您使用的是糟糕的旧类,现在已被java.time类取代
将输入字符串解析为
,因为它没有任何与UTC或时区的偏移指示LocalDateTime
定义与输入匹配的格式模式SimpleDateFormat sdf = new SimpleDateFormat("MM/dd/yyyy HH:mm:ss"); sdf.setTimeZone(TimeZone.getTimeZone("GMT-0600")); SimpleDateFormat sdf2 = new SimpleDateFormat("MM/dd/yyyy HH:mm:ss"); sdf.setTimeZone(TimeZone.getTimeZone("GMT+0530")); System.out.println(sdf2.format(sdf.parse("11/5/2018 12:54:20").getTime()));
ldt.toString():2018-05-11T12:54:20 你说这是为CST制定的。你是指中国标准时间还是北美的中央标准时间 以DateTimeFormatter f = DateTimeFormatter.ofPattern( "d/M/uuuu HH:mm:ss" ) ; LocalDateTime ldt = LocalDateTime.parse( "11/5/2018 12:54:20" , f ) ;
的格式指定一个,例如,或大陆/地区
。切勿使用2-4个字母的缩写,例如太平洋/奥克兰
或CST
或EST
,因为它们不是真正的时区,不是标准化的,甚至不是唯一的(!) 我猜你指的是纽约时间IST
zdt.toString():2018-05-11T12:54:20-04:00[美国/纽约] 显然,你想通过不同地区、不同时区的人们使用的挂钟时间来观察同一时刻。你说的IST是指爱尔兰标准时间还是印度标准时间?同样,使用实时时区,而不是这2-4个字符的伪时区ZoneId z = ZoneId.of( "America/New_York" ) ; ZonedDateTime zdt = ldt.atZone( z ) ;
zdtKolkata.toString():2018-05-11T22:24:20+05:30[亚洲/加尔各答] 要查看UTC中的相同时刻,请提取一个ZoneId zKolkata = ZoneId.of( "Asia/Kolkata" ) ; ZonedDateTime zdtKolkata = zdt.withZoneSameInstant( zKolkata ) ;
Instant
instant.toString():2018-05-11T16:54:20Z 所有这三个(Instant instant = zdtKolkata.toInstant() ;
,zdt
,zdtKolkata
)都代表同一时刻,时间线上的同一点 相比之下,instant
作为一个ldt
对象并不代表一个时刻,它不是时间线上的一个点。它没有真正的意义,直到你给它分配了一个时区来给它一个上下文。在分配这个时区之前,我们不知道在澳大利亚、非洲或美国是否意味着中午。它可能意味着任何时间在26-27小时内,全球的时区范围 ISO 8601 使用标准格式,而不是发明自己的格式将日期时间值交换为文本 默认情况下,java.time类在生成/解析字符串时方便地使用格式LocalDateTime
关于java.time 该框架是内置的