日期+时间不能转换为毫秒

时间:2017-07-28 10:42:41

标签: java

int year = Integer.parseInt(sTransDateTime2.substring(0, 4));
int month = (Integer.parseInt(sTransDateTime2.substring(4, 6)) - 1);
int day = Integer.parseInt(sTransDateTime2.substring(6, 8));
int hour = Integer.parseInt(sTransDateTime2.substring(8, 10));
int minute = Integer.parseInt(sTransDateTime2.substring(10, 12));
int second = Integer.parseInt(sTransDateTime2.substring(12));

System.out.println("year=" + year + "| month= " + month + "| day=" + day);
DateFormat df = new SimpleDateFormat("mm/dd/yyyy");
Calendar calConvert = Calendar.getInstance();
calConvert.set(year, month, day, hour, minute, second);
sTransDateTime2 = Long.toString(calConvert.getTimeInMillis() / 1000);
System.out.println("debug date: " + sTransDateTime2);

我的约会时间是年份= 2017 |月= 7 |天= 28 |小时= 17 |分钟= 0, 转换为毫秒后,它变为1501232400。 日期的结果是正确的,将于2017年7月28日,但时间变为晚上9点。 我的编码有什么问题吗?

由于

2 个答案:

答案 0 :(得分:1)

停止学习旧的java.date并进入java.time

LocalDateTime myldt = LocalDateTime.of(2017, 7, 28, 17, 0);
System.out.println(myldt);
System.out.println(myldt.atZone(ZoneId.systemDefault()).toInstant().toEpochMilli());

答案 1 :(得分:0)

看起来在一个TimeZone中完成了转换为毫秒,但毫秒转换为日期的系统位于不同的时区。 在28th July, 2017 17:00:00时区1501232400时,UTC+08:00会将时间段设为28th July, 2017 21:00:00,但是这些秒数会从UTC+12:00时区返回UTC+8:00

为了说明上述情况,我在计算毫秒时明确将时区设置为UTC+12:00。 (我已将系统时区设置为 System.out.println("year=" + year + "| month= " + month + "| day=" + day); Calendar calConvert = Calendar.getInstance(); calConvert.setTimeZone(TimeZone.getTimeZone("GMT+8:00")); calConvert.set(year, month, day, hour, minute, second); sTransDateTime2 = Long.toString(calConvert.getTimeInMillis() / 1000); System.out.println("debug date: " + sTransDateTime2); System.out.println(new Date(calConvert.getTimeInMillis())); 以显示输出)

year=2017| month= 6| day=28
debug date: 1501232400
Fri Jul 28 21:00:00 NZST 2017

这给我输出如下:

Date

请注意,21:00始终以当地时区打印日期。因此,它已根据本地时区转换毫秒数,时间更改为UTC+08:00

现在我格式化这个日期以确保我只在Date dt = calConvert.getTime(); DateFormat formatter= new SimpleDateFormat("MM/dd/yyyy HH:mm:ss"); formatter.setTimeZone(TimeZone.getTimeZone("GMT+8:00")); System.out.println(formatter.format(dt)); 中获得输出,无论系统时区是什么。

07/28/2017 17:00:00

现在我将输出视为:21:00而不是java.time的早期日期作为时间。

因此,结论是您需要格式化要在特定时区显示的日期,如果您想避免它选择显示它的系统的默认时区。

为避免所有繁琐的代码和令人困惑的问题,如其他答案所示,请转到java.time API。 JDK 8提供了java.time。当您使用JDK 6时,可以使用ThreeTen Backport。为了说明使用ZonedDateTime zdt = ZonedDateTime.of(LocalDate.of(year, month, day), LocalTime.of(hour, minute,second), ZoneId.of("Asia/Macau")); long secondsFromEpoch = zdt.toEpochSecond(); //To convert back ZonedDateTime zdtBack = Instant.ofEpochSecond(secondsFromEpoch) .atZone(ZoneId.of("Asia/Macau")); System.out.println(zdtBack); 可以轻松完成任务,以下内容与您的代码所做的相同,但是以简洁易懂的方式:

{{1}}