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点。 我的编码有什么问题吗?
由于
答案 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}}