我无法获得正确的时区与日光的偏移
我被Android的日光问题困扰了,时间应该是+3 GMT/UTC 但我只得到了+2。有没有什么解决办法,或者我处理不了?请在下面找到我的代码
TimeZone.getDefault().useDaylightTime();
SimpleDateFormat df = new SimpleDateFormat("HH:mm",Locale.ENGLISH); //"2021-02-18T11:00:00"
df.setTimeZone(TimeZone.getTimeZone("UTC"));
return df.format(calendar.getTime());
请注意,DST偏移量返回零。我应该怎么处理日光?
另一个音符我的时间约旦/安曼,
冬季应返回+2,但夏季应返回+3
解决方案
java.time
考虑为您的日期和时间工作使用java.time,这是现代Java日期和时间API。让我们首先为您想要的时间格式声明一个格式化程序:
private static final DateTimeFormatter TIME_FORMATTER
= DateTimeFormatter.ofPattern("HH:mm", Locale.ENGLISH);
现在您可以通过以下方式格式化Calendar
中的时间:
// Assume you are getting a Calendar from somewhere
Calendar calendar = new GregorianCalendar();
ZonedDateTime dateTime = calendar.toInstant().atZone(ZoneId.systemDefault());
String dateTimeString = dateTime.format(TIME_FORMATTER);
System.out.println(dateTimeString);
我刚才运行了代码,即UTC时间16:33,约旦时间19:33。输出为:
19:33
如果您不依赖于从某个地方使用老式的Calendar
,它可能会更简单、更干净。例如,要获取您所在时区的当前时间:
String timeString
= LocalTime.now(ZoneId.systemDefault()).format(TIME_FORMATTER);
System.out.println(timeString);
您的代码中出了什么问题?
您将SimpleDateFormat
的时区设置为UTC。因此,无论您的默认时区如何,都会以UTC为单位打印时间。由于UTC没有夏季时间(DST),因此没有考虑到这一点。
顺便说一句,您的这个方法调用不做任何事情:
TimeZone.getDefault().useDaylightTime();
摘自文档:
退货:
true
如果TimeZone
使用夏令时, 否则。
因此该方法不会更改任何内容,当然也不会更改UTC时区。它只查询所述时区是否使用夏令时(夏令时)。因此,由于亚洲/安曼时区有,因此在您的情况下应该会返回true
。
问题:java.time不需要Android API级别26吗?
java.time在旧的和新的Android设备上都能很好地工作。它只需要至少Java 6。
- 在Java 8和更高版本以及更新的Android设备(从API级别26开始)上,现代API是内置的。
- 在非Android Java 6和7中,获取ThreeTen Backport,这是现代类的后端口(对于JSR 310,获取ThreeTen;请参阅底部的链接)。
- 在较老的安卓系统上,可以使用去糖化或安卓版本的ThreeTen Backport。它被称为ThreeTenABP。在后一种情况下,请确保从子程序包中导入
org.threeten.bp
中的日期和时间类。
链接
- Oracle tutorial: Date Time解释如何使用java.time。
- Java Specification Request (JSR) 310,其中首先描述了
java.time
。 - ThreeTen Backport project,
java.time
到Java 6和7的后端口(JSR-310为ThreeTen)。 - Java 8+ APIs available through desugaring
- ThreeTenABP,ThreeTen Backport Android版
- Question: How to use ThreeTenABP in Android Project,并有非常详细的解释。
相关文章