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

标签 java date datetime

我有一个带有时间戳的 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/

相关文章:

java - 将 Character[] 的范围转换为 String

java - kafka connect - 审计 - 任务完成时触发事件

java - 更新当前时间日期而不在内存中爆炸

php - 哪个更适合在 MySQL 中存储非公历日期时间? datetime+PHP 将 OR varchar 或 Unix 时间戳转换为 int

javascript - 如何计算日期是否在从现在起三年内?

java - 在 Ubuntu 上运行 SimGrid-Java 示例时出现 UnsatisfiedLinkError

java - ZeroMQ 运行服务器 Java

c# - 计算一周中即将到来的一天的日期时间

java - 在Java中生成2个给定日期之间的所有日期

sql - Oracle:避免 to_date 中出现 NULL 值