You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

Java日期转分钟、字符串切割及LocalTime调用问题求助

解答你的Java日期处理相关问题

问题1:SimpleDateFormat解析小时得到负数分钟的原因

你用SimpleDateFormat("hh")解析"12"后得到-420分钟,核心原因有两个:

  1. hh是12小时制格式:解析"12"时,SimpleDateFormat默认将其视为12 AM(午夜0点),而非12 PM(中午)。
  2. 时区偏移导致时间戳为负DategetTime()返回的是从1970-01-01 00:00:00 GMT开始的毫秒数。如果你的本地时区是GMT-7(比如美国山地时间),那么1970-01-01 00:00(本地时间)对应的GMT时间是1969-12-31 17:00,时间戳为-7*3600*1000 = -25200000毫秒。计算后:(-25200000 / 1000) /60 = -420,正好是你的输出。

正确的做法:不需要用Date类来转换,直接将字符串转为整数小时再计算总分钟:

String hourStr = "12";
int hours = Integer.parseInt(hourStr);
long totalMinutes = hours * 60;
System.out.println("Minute " + totalMinutes); // 输出720

如果偏好Java 8+的时间API(更推荐,线程安全且设计更合理):

LocalTime time = LocalTime.parse("12:00", DateTimeFormatter.ofPattern("hh:mm"));
long totalMinutes = time.toSecondOfDay() / 60;
System.out.println("Minute " + totalMinutes); // 输出720

问题2:字符串切割丢失重复时间的问题

你的代码中用temp.replace(temp.substring(0,loop+5),"")会替换所有匹配的子串,比如第一个"10:00"被替换后,后面Fri的"10:00"也会被删掉,导致丢失数据。

修复方案:每次只截取并移除字符串的前5个字符,而不是用replace

String date = "Sun 10:00-20:00\r\n" + 
              "Fri 05:00-10:00\r\n" + 
              "Fri 16:30-23:50\r\n" + 
              "Sat 10:00-24:00\r\n" + 
              "Sun 01:00-04:00\r\n" + 
              "Sat 02:00-06:00\r\n" + 
              "Tue 03:30-18:15\r\n" + 
              "Tue 19:00-20:00\r\n" + 
              "Wed 04:25-15:14\r\n" + 
              "Wed 15:14-22:40\r\n" + 
              "Thu 00:00-23:59\r\n" + 
              "Mon 05:00-13:00\r\n" + 
              "Mon 15:00-21:00";

List<String> hourList = new ArrayList<>();
// 先处理字符串:去掉星期、空格、换行,把-换成空
String processed = date.toLowerCase()
                       .replaceAll("sun|mon|tue|wed|thu|fri|sat", "")
                       .replaceAll("[\\r\\n ]", "")
                       .replace("-", "");

// 循环截取前5个字符,直到字符串为空
while (processed.length() >= 5) {
    String time = processed.substring(0, 5);
    hourList.add(time);
    processed = processed.substring(5);
    System.out.println("Hour " + time);
}

这样输出就会包含所有时间:10:00、20:00、05:00、10:00、16:30、23:50...,不会丢失重复值。


问题3:LocalTime.getMinute()输出0而非1200的原因

getMinute()方法返回的是时间中的分钟部分(范围0-59),而不是从0点开始的总分钟数。你想要的20:00对应的总分钟数是20*60 + 0 = 1200,可以用以下两种方式获取:

LocalTime froms = LocalTime.parse("20:00", DateTimeFormatter.ofPattern("HH:mm", Locale.ENGLISH));
// 方式1:直接计算小时*60 + 分钟
long totalMinutes1 = froms.getHour() * 60 + froms.getMinute();
// 方式2:用toSecondOfDay()转换为总秒数再除以60
long totalMinutes2 = froms.toSecondOfDay() / 60;

System.out.println("Total Minutes: " + totalMinutes1); // 输出1200
System.out.println("Total Minutes: " + totalMinutes2); // 输出1200

内容的提问来源于stack exchange,提问作者Mr.Kim

火山引擎 最新活动