Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/330.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/date/2.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 将CST时区转换为所需的时区_Java_Date_Simpledateformat - Fatal编程技术网

Java 将CST时区转换为所需的时区

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

我需要将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时区的系统上执行了这个

    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类取代

      将输入字符串解析为
      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[美国/纽约]

      显然,你想通过不同地区、不同时区的人们使用的挂钟时间来观察同一时刻。你说的IST是指爱尔兰标准时间还是印度标准时间?同样,使用实时时区,而不是这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 该框架是内置的