gpt4 book ai didi

java - 将时分字符串时间转换为 utc,反之亦然

转载 作者:行者123 更新时间:2023-11-29 18:42:28 25 4
gpt4 key购买 nike

我正在尝试采用“HH:mm”格式的字符串并将其从本地转换为 utc,反之亦然。这是我到目前为止所拥有的:

    private String doTimeConversion(String time, boolean type) {

DateFormat dfLocal = new SimpleDateFormat("HH:mm");
DateFormat dfUTC = new SimpleDateFormat("HH:mm");
TimeZone local = TimeZone.getDefault();
TimeZone utc = TimeZone.getTimeZone("UTC");

dfLocal.setTimeZone(local);
dfUTC.setTimeZone(utc);

Date date;
String newTime = "00:00";
try {
//If true: local to utc/If false: utc to local
if (type) {
date = dfLocal.parse(time);
newTime = dfUTC.format(date);
} else {
date = dfUTC.parse(time);
newTime = dfLocal.format(date);
}

} catch (ParseException e) {
e.printStackTrace();
}
return newTime;
}

这似乎大部分都有效,但我遇到的问题是,虽然我应该使用 TimeZone.getDefault() 来获取设备时间,但它没有考虑夏令时。不是将 12:00(UTC) 更改为 08:00(EDT),而是将其更改为 07:00(EST)。

总的来说,我只是希望能够获取用户输入的时间(字符串)并使用设备时区来假设用户输入的内容是根据他们的时区并将其转换为 utc 以及从utc 回到设备时区。

最佳答案

java.time

import org.threeten.bp.LocalDate;
import org.threeten.bp.LocalDateTime;
import org.threeten.bp.LocalTime;
import org.threeten.bp.ZoneId;
import org.threeten.bp.ZoneOffset;
import org.threeten.bp.ZonedDateTime;

public class ConvertTimeToAndFromUtc {

/** @param type If true: local to utc/If false: utc to local */
private static String doTimeConversion(String time, boolean type) {
ZoneId localZone = ZoneId.systemDefault();
LocalTime lt = LocalTime.parse(time);
LocalDateTime ldt = LocalDate.now(localZone).atTime(lt);
ZonedDateTime resultTime;
if (type) {
resultTime = ldt.atZone(localZone).withZoneSameInstant(ZoneOffset.UTC);
} else {
resultTime = ldt.atOffset(ZoneOffset.UTC).atZoneSameInstant(localZone);
}
LocalTime newTime = resultTime.toLocalTime();
return newTime.toString();
}

public static void main(String[] args) {
System.setProperty("user.timezone", "Asia/Gaza");

System.out.println("09.21 local to UTC: " + doTimeConversion("09:21", true));
System.out.println("23:13 UTC to local: " + doTimeConversion("23:13", false));
}

}

今天打印了上面的程序(在 Java 7 上测试):

09.21 local to UTC: 06:21
23:13 UTC to local: 02:13

加沙地带在每年的这个时候偏移 +03:00,在标准/正常时间偏移 +02:00,因此转换似乎考虑了夏令时 (DST)(后一个转换是在午夜过后).

我正在使用 java.time,现代 Java 日期和时间 API。您使用的日期时间类 DateFormatSimpleDateFormatTimeZoneDate 都已过时,即将推出有一系列的设计问题。而且它们也不是真正适合手头的问题。

问题:我可以在 Android 上使用 java.time 吗?

是的,java.time 在新旧 Android 设备上都能很好地工作。它只需要至少 Java 6

  • 在 Java 8 及更高版本以及较新的 Android 设备(从 API 级别 26 开始)中,现代 API 是内置的。仅在这种情况下从 java.time 包(不是 org.threeten.bp)导入日期时间类。
  • 在 Java 6 和 7 中获取 ThreeTen Backport,新类的反向端口(ThreeTen for JSR 310;查看底部的链接)。
  • 在(较旧的)Android 上使用 ThreeTen Backport 的 Android 版本。它叫做 ThreeTenABP。并确保使用子包从 org.threeten.bp 导入日期和时间类。

链接

关于java - 将时分字符串时间转换为 utc,反之亦然,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52819343/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com