Java UTC给定时区的日期和时间

Java UTC给定时区的日期和时间,java,date,time,Java,Date,Time,我有以下字符串:201912061000100,对应于2019/12/06的10:00+1。 在这种情况下,如何将其转换为utc时间2019/12/06 09:00 这个字符串也可以有+2,+3-1, -2 ... 时区,所以我必须能够转换其他字符串也 +或-符号在另一个实例中给出,但是,如果它有用,可以将其添加到时间和日期字符串中。 (字符串可能会变成201912061000+0100) 现在,我正在手动转换它,拆分字符串,但我正试图找到一种方法来确保安全,因为它变得棘手,像00这样的小时和分

我有以下字符串:201912061000100,对应于2019/12/06的10:00+1。 在这种情况下,如何将其转换为utc时间2019/12/06 09:00

这个字符串也可以有+2,+3-1, -2 ... 时区,所以我必须能够转换其他字符串也

+或-符号在另一个实例中给出,但是,如果它有用,可以将其添加到时间和日期字符串中。 (字符串可能会变成201912061000+0100)

现在,我正在手动转换它,拆分字符串,但我正试图找到一种方法来确保安全,因为它变得棘手,像00这样的小时和分钟必须更改日期,可能是月份和年份。 这就是我迄今为止所做的:

hour -= hourOffset;
if(hour<0){
    hour += 24
}
minutes -= minutesOffset;
if(minutes<0){
    minutes += 60
}
hour-=hourofset;
如果(小时)
由于您在外部处理时区偏移的加号或减号,因此如果需要,您可以将其插入上面的exsample中,而不是加号


由于您在外部处理时区偏移的加号或减号,如果需要,您只需将其插入上面的exsample中,而不是加号。

您可以通过以下代码直接将时间转换为UTC

 String dateStr = "201912061000+0100";
    DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyyMMddHHmm");
    final LocalDateTime parse = LocalDateTime.parse(dateStr.substring(0, dateStr.length()-5), formatter);
    final ZoneId zone = ZoneId.of("GMT"+dateStr.substring(12,15)+":"+dateStr.substring(15));
    final ZonedDateTime given = ZonedDateTime.of(parse, zone);
    final String toUTC = given.withZoneSameInstant(ZoneId.of("UTC"))
        .format(DateTimeFormatter.ofPattern("yyyy/MM/dd HH:mm")); 

您可以通过以下代码直接将时间转换为UTC

 String dateStr = "201912061000+0100";
    DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyyMMddHHmm");
    final LocalDateTime parse = LocalDateTime.parse(dateStr.substring(0, dateStr.length()-5), formatter);
    final ZoneId zone = ZoneId.of("GMT"+dateStr.substring(12,15)+":"+dateStr.substring(15));
    final ZonedDateTime given = ZonedDateTime.of(parse, zone);
    final String toUTC = given.withZoneSameInstant(ZoneId.of("UTC"))
        .format(DateTimeFormatter.ofPattern("yyyy/MM/dd HH:mm")); 

在处理日期和时间时,通常最好不要执行字符串操作,而是使用从Java 8引入的包扩展而来的许多类中的一个

在您的情况下,您希望使用,因为您的字符串正好表示:带有偏移量的日期时间。请注意,A在这里并不合适,因为偏移量信息(例如“+01:00”)不足以表示整个时区

要从字符串中获取
OffsetDateTime
,只需对其进行解析即可

让我们做吧

步骤1:调整字符串以包含偏移符号(加号或减号)

步骤2:将该字符串解析为
OffsetDateTime
对象

DateTimeFormatter dtf = DateTimeFormatter.ofPattern("yyyyMMddHHmmZ");
OffsetDateTime odt = OffsetDateTime.parse(datetimeString, dtf);
步骤3:将
OffsetDateTime
转换为UTC

OffsetDateTime odtUTC = odt.withOffsetSameInstant(ZoneOffset.UTC);
打印出这些变量

System.out.println(datetimeString);
System.out.println(odt);
System.out.println(odtUTC);
将获得以下输出:

201912061000+0100

2019-12-06T10:00+01:00

2019-12-06T09:00Z


在处理日期和时间时,通常最好不要执行字符串操作,而是使用从Java 8引入的包扩展而来的许多类中的一个

在您的情况下,您希望使用,因为您的字符串正好表示:带有偏移量的日期时间。请注意,A在这里并不合适,因为偏移量信息(例如“+01:00”)不足以表示整个时区

要从字符串中获取
OffsetDateTime
,只需对其进行解析即可

让我们做吧

步骤1:调整字符串以包含偏移符号(加号或减号)

步骤2:将该字符串解析为
OffsetDateTime
对象

DateTimeFormatter dtf = DateTimeFormatter.ofPattern("yyyyMMddHHmmZ");
OffsetDateTime odt = OffsetDateTime.parse(datetimeString, dtf);
步骤3:将
OffsetDateTime
转换为UTC

OffsetDateTime odtUTC = odt.withOffsetSameInstant(ZoneOffset.UTC);
打印出这些变量

System.out.println(datetimeString);
System.out.println(odt);
System.out.println(odtUTC);
将获得以下输出:

201912061000+0100

2019-12-06T10:00+01:00

2019-12-06T09:00Z


到目前为止,您尝试了什么?您被卡在哪里了?您真的是指结尾处的“01000”吗?我本以为是“0100”(一减零),对应于通常的“+01:00”!此外……没有任何“+”或“-”作为偏移量,时间戳的字符串表示是不明确的。它可能是“…+01:00”或“…-01:00”!!!如何区分?前面已经给出了+或-,所以我知道01:00是加号还是减号???在您的字符串示例(“201912061000100”)中,没有加号或减号!到目前为止您尝试了什么?您卡在哪里了?您真的是指结尾处的“01000”吗?我原以为是“0100”(一减零),对应于通常的“+01:00”!此外…如果偏移量没有任何“+”或“-”,则时间戳的此字符串表示形式是不明确的。它可能是“…+01:00”或“…-01:00”!!!如何区分?前面已经给出了+或-,因此我知道在字符串示例(“201912061000100”)中,01:00是加号还是减号,没有加号或减号!这不转换为utc,我返回初始日期。这是输出2019/12/06 10:00,但如果时区差为+1,我应该得到2019/12/06 09:00。这不转换为utc,我返回初始日期。这是输出2019/12/06 10:00,但如果时区差为+1,我应该得到2019/12/06 09:00这是一个非常好的答案。解释和建议非常中肯和简洁。这是一个非常好的答案。解释和建议非常中肯和简洁。