gpt4 book ai didi

每 15 分钟的 Java 日期时间比较

转载 作者:行者123 更新时间:2023-11-29 03:09:17 25 4
gpt4 key购买 nike

我有一个带有时间戳的 csv 记录,例如每 5 分钟一次:

- 2015/05/19 16:15:00
- 2015/05/19 16:20:00
- 2015/05/19 16:35:00
- 2015/05/19 16:10:00
- 2015/05/19 16:55:00

我正在使用一个数组来比较每条记录的日期是否在 15 分钟内:

ArrayList<String> per15Min = new ArrayList<String>() {{
add("00,15");
add("15,30");
add("30,45");
add("45,00");
}};

我所做的是读取每条记录,根据“,”拆分它以提取日期:

private SimpleDateFormat csvDateFormat = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss");
private SimpleDateFormat fileDateFormat = new SimpleDateFormat("yyyyMMddHHmm");

// Loop thru each record
while ((perLine = br.readLine()) != null) {

// Store date per record in a string
String[] perColumn = perLine.split(",", -1);
String date = perColumn[0];

// Convert record date to yyyyMMddHHmm
Date subDateP = csvDateFormat.parse(csvDate);
String subDateF = fileDateFormat.format(subDateP);

// Extract the date without the day (dd)
String subDate = subDateF.substring(0,10);

for (int j = 0 ; j < per15Min.size() ; j++) {
String[] s = per15Min.get(j).split(",", -1);
String m1 = s[0];
String m2 = s[1];

// All dates are in a yyyyMMddHHmm format
Date before = fileDateFormat.parse(subDate + m1);
Date after = fileDateFormat.parse(subDate + m2);
Date csvRd = fileDateFormat.parse(date);

System.out.println("DATE " + before + " : " + after + " : " + csvRd);

// Having problems doing date comparison
if ((before.compareTo(csvRd) >= 0) && (csvRd.compareTo(after) < 0)) {
System.out.println("DATE HERE" + before + " : " + after + " : " + csvRd);
}


}
}

正如您从 sysout 中看到的那样,它似乎不起作用:

DATE HEREWed May 20 07:30:00 SGT 2015 : Wed May 20 07:45:00 SGT 2015 : Wed May 20 07:30:00 SGT 2015
DATE HEREWed May 20 07:30:00 SGT 2015 : Wed May 20 07:45:00 SGT 2015 : Wed May 20 07:25:00 SGT 2015
DATE HEREWed May 20 07:30:00 SGT 2015 : Wed May 20 07:45:00 SGT 2015 : Wed May 20 07:20:00 SGT 2015
DATE HEREWed May 20 07:30:00 SGT 2015 : Wed May 20 07:45:00 SGT 2015 : Wed May 20 07:15:00 SGT 2015
DATE HEREWed May 20 07:30:00 SGT 2015 : Wed May 20 07:45:00 SGT 2015 : Wed May 20 07:10:00 SGT 2015

我需要的是,如果时间戳(每 5 分钟)在 15 分钟数组内,它将进入条件:

00-10 minutes must enter at 00,15
15-25 minutes must enter at 15,30
30-40 minutes must enter at 30,45
45-55 minutes must enter at 45,00

有人知道 if 条件有什么问题吗?

最佳答案

任何时候你需要处理日期/时间信息,你应该使用合适的 API,在你的情况下你可以不用 DateCalendar,但是它如果可以的话,最好使用 Java 8 的 Time API 或 Joda-Time,因为交互比 Calendar

更简单

String 日期值转换为 Date 或(更好)LocalDateTime 值并使用它们的比较方法

  • Date#before, Date#after, Date#equals
  • LocalDateTime#isBefore, LocalDateTime#isAfter, LocalDateTime#equals

例如……

List<String> listOfDateValues = new ArrayList<>(25);
listOfDateValues.addAll(Arrays.asList(
new String[]{"2015/05/19 16:10:00",
"2015/05/19 16:00:00",
"2015/05/19 16:05:00",
"2015/05/19 16:10:00",
"2015/05/19 16:15:00",
"2015/05/19 16:20:00",
"2015/05/19 16:25:00",
"2015/05/19 16:30:00",
"2015/05/19 16:35:00",
"2015/05/19 16:40:00",
"2015/05/19 16:45:00",
"2015/05/19 16:50:00",
"2015/05/19 16:55:00",
"2015/05/19 16:25:00"}));

List<String> per15Min = new ArrayList<>(
Arrays.asList(
new String[]{
"00,15",
"16,30",
"31,45",
"46,59" //??
}
)
);

DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy/MM/dd HH:mm:ss");
Map<String, List<String>> mapGroups = new HashMap<>();
for (String dateValue : listOfDateValues) {

LocalDateTime ldt = LocalDateTime.parse(dateValue, formatter);
for (String range : per15Min) {
String[] split = range.split(",");
LocalDateTime startRange = ldt.withMinute(Integer.parseInt(split[0])).withSecond(0).withNano(0);
LocalDateTime endRange = ldt.withMinute(Integer.parseInt(split[1])).withSecond(59).withNano(999999999);
if ((ldt.equals(startRange) || ldt.isAfter(startRange))
&& (ldt.equals(endRange) || ldt.isBefore(endRange))) {
List<String> group = mapGroups.get(range);
if (group == null) {
group = new ArrayList<String>(25);
mapGroups.put(range, group);
}
group.add(dateValue);
}
}

}

for (String range : per15Min) {
List<String> group = mapGroups.get(range);
System.out.println(range);
for (String dateValue : group) {
System.out.println(" -> " + dateValue);
}
}

哪些输出...

00,15
-> 2015/05/19 16:10:00
-> 2015/05/19 16:00:00
-> 2015/05/19 16:05:00
-> 2015/05/19 16:10:00
-> 2015/05/19 16:15:00
16,30
-> 2015/05/19 16:20:00
-> 2015/05/19 16:25:00
-> 2015/05/19 16:30:00
-> 2015/05/19 16:25:00
31,45
-> 2015/05/19 16:35:00
-> 2015/05/19 16:40:00
-> 2015/05/19 16:45:00
46,59
-> 2015/05/19 16:50:00
-> 2015/05/19 16:55:00

请注意,我已经修改了您的护林员,00-1515-30 的范围是没有意义的... xx:15.00 去吗?进入两个集合?

关于每 15 分钟的 Java 日期时间比较,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30338162/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com