Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/320.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 转换时的时间转换问题添加一天额外时间_Java_Timezone_Java 7_Datetime Format - Fatal编程技术网

Java 转换时的时间转换问题添加一天额外时间

Java 转换时的时间转换问题添加一天额外时间,java,timezone,java-7,datetime-format,Java,Timezone,Java 7,Datetime Format,我试图转换时区,但它增加了一天额外的java函数 "" deActivationDate=2021-06-25T23:59:59.000+0000""; SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSZ"); try { Date date =formatter.parse(deA

我试图转换时区,但它增加了一天额外的java函数

   ""  deActivationDate=2021-06-25T23:59:59.000+0000"";
    
    SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSZ");

    try {
        Date date =formatter.parse(deActivationDate);
        deActivationDate=formatter.format(date);
        LOGGER.info("time format  printing 1" +deActivationDate);//2021-06-26T04:29:59.000+0430

        deActivationDate = deActivationDate.substring(0, deActivationDate.length()-2)+":30";

        LOGGER.info("time format  printing 2" +deActivationDate);//2021-06-26T04:29:59.000+04:30""

在上面的停用日期是25,当我提供输入时,但在格式化程序parase方法之后,其转换为26为什么有一天操作系统会添加如何避免它。

以下是代码的修复方法。尽管我们建议不要使用子字符串方法

String deActivationDate="2021-06-25T23:59:59.000+0000";
 
try {
  SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSZ");
  formatter.setTimeZone(TimeZone.getTimeZone("UTC"));
  Date date =formatter.parse(deActivationDate);
  deActivationDate=formatter.format(date);
  
  System.out.println("time format  printing 1: " +deActivationDate); 
  //2021-06-25T23:59:59.000+0000

  deActivationDate = deActivationDate.substring(0, 
  deActivationDate.length()-4)+"0430";
    
  System.out.println("time format  printing 2: " +deActivationDate); 
  //2021-06-25T23:59:59.000+0430

} catch (Exception e) {
  System.err.println(e.getMessage());
}

感谢大家的建议@beshambher chaukhwan m,我已通过以下代码实现了更改

String deActivationDate="2021-06-25T23:59:59.000+0000";
                         
                         SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSZ");
                         
                        try {
                            formatter.setTimeZone(TimeZone.getTimeZone("UTC"));
                            Date date =formatter.parse(deActivationDate);
                            deActivationDate=formatter.format(date);                    
                            if(TimeZone.getDefault().useDaylightTime()) {
                                  deActivationDate = deActivationDate.substring(0, deActivationDate.length()-4)+"04:30";
                            }else {         
                                  deActivationDate = deActivationDate.substring(0, deActivationDate.length()-4)+"03:30";
                            }
java.time通过Three-Ten Backport

您应该认真考虑使用Java.Times,即现代java日期和时间API,用于非平凡的日期和时间工作。 您的问题不太清楚,但我认为您希望将日期和时间字符串转换为您自己时区(在本例中为亚洲/德黑兰时区)中的相同日期和挂钟时间。因此,一个不同的时间点:在伊朗接近一天的结束,而不是在UTC接近一天的结束。并在UTC偏移量中使用冒号

我声明了两个格式化程序,一个用于不带冒号的解析,另一个用于带冒号的格式化:

现在,您的转换如下所示:

    String deActivationDate = "2021-06-25T23:59:59.000+0000";
    
    OffsetDateTime dateTime = OffsetDateTime.parse(deActivationDate, PARSER);
    deActivationDate = dateTime.atZoneSimilarLocal(ZoneId.systemDefault())
            .format(PRINTER);
    System.out.println("time format  printing: " +deActivationDate);
输出在Java 1.7.0_67上进行了测试,有三个后端端口版本1.3.6:

时间格式打印:2021-06-25T23:59:59+04:30

Java知道亚洲/德黑兰时区在6月25日使用夏季时间(DST),因此转换并打印所需的偏移量
+04:30
。如果日期是一年中的标准时间部分,则会打印出
+03:30

不打印0毫秒,这在大多数情况下是一个优势。格式为ISO 8601,根据ISO 8601标准,秒的分数为0时是可选的。如果需要millis,请使用此更简单的格式化程序:

private static final DateTimeFormatter PRINTER
        = DateTimeFormatter.ofPattern("uuuu-MM-dd'T'HH:mm:ss.SSSxxx");
时间格式打印:2021-06-25T23:59:59.000+04:30

半开放:您不应在新的一天开始前1秒表示一天的结束。首先,这是错误的:一天不会在结束前一秒钟结束。第二,它可能会导致错误,因为时间落在最后一秒之内,因此在程序中既不属于某一天也不属于另一天。即使这种情况在实践中没有发生,您也会让程序员浪费时间去思考它是否会发生。相反,将一天的结束表示为第二天的第一个时刻(通常为00:00)。测试时,要求时间必须严格在一天结束前属于一天。这种方法适用于所有类型的时间间隔,当然也适用于时间间隔。它们被称为半开放间隔

问:java.time不需要Java8吗? time在Java7上运行良好。它至少需要Java6

  • 在Java8和更高版本以及更新的Android设备上(API级别26),现代API是内置的
  • 在非androidjava6和7中,获取三个后端口,即现代类的后端口(三个十用于jsr310;请参见底部的链接)
  • 在较旧的Android上,可以使用desugaring或Android版本的ThreeTen Backport。它叫ThreeTenABP。在后一种情况下,请确保使用子包从
    org.threeten.bp
    导入日期和时间类
链接
  • 解释如何使用java.time
  • ,其中首先描述了
    java.time
  • ,java.time的后端口到Java6和Java7(JSR-310为三十)
  • ,Android版Three Ten Backport
  • ,解释得非常透彻

上面的日期是UTC+0:0时区,转换后的日期是UTC+4:30,这是正确的。问题是什么?顺便说一句,为什么不切换到“新的”java.time api使事情变得更简单呢?如果格林威治时间是上午12点(UTC+00:00)然后,在您的手表中,时间将是凌晨4:30,因为您离时区中心有4.5小时的路程。在解析日期之前,您可能需要在日期格式化程序中添加一个特定的时区,如下面的
formatter.setTimeZone(timezone.getTimeZone(“UTC”)
这是否回答了您的问题?你说得很对,但过了一段时间后,时区将更改为03:30,因此我们不希望在代码中手动更改,这就是我们没有添加子字符串的原因。请检查此问题。我强烈建议使用Java 6+的人使用此答案。这将使代码在将来升级到更高版本的Java时易于移植。答案是不正确的。它全年打印
+04:30
。伊朗将回到标准时间,并在2021年9月22日抵消+03:30。我用字符串
2021-11-25T23:59:59.000+0000
尝试了您的代码,但仍然得到
时间格式打印1:2021-11-25T23:59:59.000+04:30
useDaylightTime
方法只告诉您时区使用夏令时(夏季),而不是一年中的哪个部分使用夏令时,因此它总是返回true。
private static final DateTimeFormatter PRINTER
        = DateTimeFormatter.ofPattern("uuuu-MM-dd'T'HH:mm:ss.SSSxxx");