Java如何获取自定义日期时间的epoch?转换报错且12pm变0怎么解决
问题原因
- 12点转0的问题:你调用的
Calendar.HOUR是12小时制字段,取值范围是0-11,正午/午夜12点都会返回0,要获取24小时制的小时需要使用Calendar.HOUR_OF_DAY字段,取值范围0-23。 - 解析报错的问题有三个:
- 日期格式不匹配:你拼接的字符串是
年-月-日格式,但是DateTimeFormatter里写的是yyyy-dd-MM,也就是年-日-月,月份和日期的位置完全颠倒 - 时间格式不匹配:你拼接的时间没有毫秒部分,但是格式化串里多了
.SSS的毫秒占位符 - 小时位数不匹配:你拼接的小时没有补前置0,比如0点会拼成
0,但是格式化串里的HH要求必须是两位数字,所以解析到第11位(也就是小时的位置)时格式校验失败
- 日期格式不匹配:你拼接的字符串是
最优实现方案
你完全不需要手动拼接字符串再转时间,直接用java.time提供的API就能直接生成当天12点的时间对象,再转epoch值,代码更简洁也不容易出错:
// 生成当天12:00:00的UTC时间的epoch毫秒值 LocalDateTime todayNoon = LocalDate.now().atTime(12, 0, 0); long epochMilli = todayNoon.toInstant(ZoneOffset.UTC).toEpochMilli(); System.out.println(epochMilli); // 如果需要使用当前时区的12点,替换成对应时区即可,比如东8区: // long epochMilli = todayNoon.toInstant(ZoneOffset.ofHours(8)).toEpochMilli();
原有代码的修正版本
如果一定要保留你原来的实现逻辑,做如下修改即可正常运行:
Calendar now = Calendar.getInstance(); int year = now.get(Calendar.YEAR); int month=now.get(Calendar.MONTH)+1; int date=now.get(Calendar.DATE); String yearInString = String.valueOf(year); String monthInString=String.valueOf(month); if(monthInString.length()==1){ monthInString="0"+monthInString; } String dateInString=String.valueOf(date); if(dateInString.length()==1){ dateInString="0"+dateInString; } // 替换为24小时制字段 int hour=now.get(Calendar.HOUR_OF_DAY); String hourInString=String.valueOf(hour); // 补充小时补0逻辑 if(hourInString.length()==1){ hourInString="0"+hourInString; } int minute=now.get(Calendar.MINUTE); String minuteInString=String.valueOf(minute); if(minuteInString.length()==1){ minuteInString="0"+minuteInString; } int second=now.get(Calendar.SECOND); String secondInString=String.valueOf(second); if(secondInString.length()==1){ secondInString="0"+secondInString; } String HRD=yearInString+"-"+monthInString+"-"+dateInString+" "+hourInString+":"+minuteInString+":"+secondInString; System.out.println(HRD); // 修正格式化串:调整月日顺序,去掉多余的毫秒占位符 DateTimeFormatter dtf = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"); LocalDateTime dt = LocalDateTime.parse(HRD, dtf); Instant instant = dt.toInstant(ZoneOffset.UTC); System.out.println(instant.toEpochMilli());
内容的提问来源于stack exchange,提问作者LEGENDRYzZzZ
相关产品推荐
相关产品推荐

