背景
我正在使用适用于 Android 的threetenbp backport(此处)来处理各种与时间相关的数据操作。
其中之一是将时间转换为不同的时区(当前为 UTC 并返回)。
我知道如果您使用类似的东西,这是可能的:
LocalDateTime now = LocalDateTime.now();
LocalDateTime nowInUtc = now.atZone(ZoneId.systemDefault()).withZoneSameInstant(ZoneId.of("UTC")).toLocalDateTime();
这工作得很好,反之也很容易。
问题
我试图避免库的初始化,它将相当大的区域文件加载到其中。我已经想出了如何在没有这个的情况下处理各种与日期/时间相关的操作,除了转换为 UTC 并返回的情况。
从正确的转换开始,我得到的错误是整整 1 小时。
我试过的
这是我发现并尝试过的:
// getting the current time, using current time zone:
Calendar cal = Calendar.getInstance();
LocalDateTime now = LocalDateTime.of(cal.get(Calendar.YEAR), cal.get(Calendar.MONTH) + 1, cal.get(Calendar.DAY_OF_MONTH), cal.get(Calendar.HOUR_OF_DAY),
cal.get(Calendar.MINUTE), cal.get(Calendar.SECOND), cal.get(Calendar.MILLISECOND) * 1000000);
//the conversion itself, which is wrong by 1 hour in my tests:
LocalDateTime alternativeNowInUtc = now.atZone(ZoneOffset.ofTotalSeconds(TimeZone.getDefault().getRawOffset() / 1000)).withZoneSameInstant(ZoneId.ofOffset("UTC", ZoneOffset.ofHours(0))).toLocalDateTime();
问题
我写的到底有什么问题?如何在不初始化库的情况下获得用于转换时间的替代代码?
给定一个 LocalDateTime 实例作为输入,如何将其从当前时区转换为 UTC,以及从 UTC 转换为当前时区?