You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Java如何获取自定义日期时间的epoch?转换报错且12pm变0怎么解决

问题原因

  • 12点转0的问题:你调用的Calendar.HOUR是12小时制字段,取值范围是0-11,正午/午夜12点都会返回0,要获取24小时制的小时需要使用Calendar.HOUR_OF_DAY字段,取值范围0-23。
  • 解析报错的问题有三个:
    1. 日期格式不匹配:你拼接的字符串是年-月-日格式,但是DateTimeFormatter里写的是yyyy-dd-MM,也就是年-日-月,月份和日期的位置完全颠倒
    2. 时间格式不匹配:你拼接的时间没有毫秒部分,但是格式化串里多了.SSS的毫秒占位符
    3. 小时位数不匹配:你拼接的小时没有补前置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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.01 06:45:05