Java日期转分钟、字符串切割及LocalTime调用问题求助
解答你的Java日期处理相关问题
问题1:SimpleDateFormat解析小时得到负数分钟的原因
你用SimpleDateFormat("hh")解析"12"后得到-420分钟,核心原因有两个:
hh是12小时制格式:解析"12"时,SimpleDateFormat默认将其视为12 AM(午夜0点),而非12 PM(中午)。- 时区偏移导致时间戳为负:
Date的getTime()返回的是从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




