使用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
由于
答案 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;