Java TimeZoneOffset时间转换

时间:2016-11-29 15:42:58

标签: java-8 timezone-offset

使用Jdk8。 我试图将实际上只有几小时(如1130)的时间转换为DateTime。我正在尝试2种方式,因为它们都没有正常工作。 1130转换为11:00,另一个3:00转换为正确。还有第三种方式命名我的时区。

Long ltime = Long.parseLong("1130");
   Long  seconds = (ltime/100)*60*60;
   LocalDateTime tsutcDttime = LocalDateTime.ofEpochSecond(seconds, 0, ZoneOffset.UTC);
    LocalDateTime lclDttime =   LocalDateTime.ofInstant(Instant.ofEpochSecond(seconds), ZoneId.systemDefault());
 System.out.println("ZoneId.systemDefault: " +ZoneId.systemDefault());
 System.out.println("UTC LocalDateTime : "+ tsutcDttime); 
 System.out.println("Sys Def LocalDateTime : "+ lclDttime); 

ZoneId.systemDefault: America / Los_Angeles

UTC LocalDateTime:1970-01-01T 11:00

Sys Def LocalDateTime:1970-01-01T 03:00

这个问题在下面得到了解决。

此问题的第2部分 对于我的一些时间组件,我有一个日期和其他一些我没有(但我必须将所有内容转换为日期时间。

如何添加实际日期?我没有看到方法LocalDate(日期)?对于其他人,只要将默认值设为1970,除非存在更好的soln。 以下仅列出了1970年的日期:

LocalDateTime localDateTime = LocalDateTime.ofEpochSecond(secondsOfDay, 0, ZoneOffset.UTC); 

但是当我有约会时我想将它添加到secondsOfDay并创建我的DateTime-如何。比如Date = 2016年1月1日+ secondsOfDay

由于

2 个答案:

答案 0 :(得分:2)

假设字符串" 1130"表示需要11小时30分钟才能将小时和分钟分别转换为秒:

long ltime = Long.parseLong("1130");

long hoursAsSeconds = (ltime / 100) * 60 * 60;
long minsAsSeconds = (ltime % 100) * 60;

long secondsOfDay = hoursAsSeconds + minsAsSeconds;

然后,您可以使用LocalTime获取给定秒数的本地时间:

LocalTime localTime = LocalTime.ofSecondOfDay(secondsOfDay);

您也可以通过解析时间直接获取当地时间:

LocalTime localTime = LocalTime.parse("1130", DateTimeFormatter.ofPattern("HHmm"));

通过它,您可以使用以下内容获得LocalDateTime

LocalDateTime localDateTime = LocalDateTime.of(LocalDate.now(), localTime);

ZonedDateTime使用:

ZonedDateTime zonedDateTime = ZonedDateTime.of(LocalDate.now(), localTime, ZoneId.of("America/Los_Angeles"));

答案 1 :(得分:1)

此表达式导致问题:

 Long  seconds = (ltime/100)*60*60;

除法运算符返回整数值,因此你在这里失去了精度。

1130/100 = 11.3 ~ 11
11 * 60*60 = 39600
11.3 * 60*60 = 40680

分区应该是表达式中的最后一个操作:

Long  seconds = (ltime*60*60)/100;