Java 按分钟比较日历时间

Java 按分钟比较日历时间,java,java.util.date,date,Java,Java.util.date,Date,我想用“分钟”计算“周一17:00”和“周二5:00”之间的差异 如何使用Java实现这一点。我不太明白如何使用日历,SimpleDataFormat不支持Mon、Tue、Wed、e.t.c功能。有什么帮助吗 这个问题只涉及一周,因此最早是“太阳00:00”,最晚是“星期六23:59” 另外,对于这种格式的许多字符串,我还想对它们进行排序,从最先发生的事情到最后发生的事情。因为我认为首先对它们进行排序会使任务(确定差异)更容易。可能是这样的 import java.text.SimpleDate

我想用“分钟”计算“周一17:00”和“周二5:00”之间的差异 如何使用Java实现这一点。我不太明白如何使用日历,SimpleDataFormat不支持Mon、Tue、Wed、e.t.c功能。有什么帮助吗

这个问题只涉及一周,因此最早是“太阳00:00”,最晚是“星期六23:59”


另外,对于这种格式的许多字符串,我还想对它们进行排序,从最先发生的事情到最后发生的事情。因为我认为首先对它们进行排序会使任务(确定差异)更容易。

可能是这样的

import java.text.SimpleDateFormat;
import java.util.Locale;
import java.util.concurrent.TimeUnit;

public class DateCompare {

    public static void main(String[] args) {
        try {
            final String start = "Mon 17:00";
            final String end = "Tue 5:00";
            SimpleDateFormat formatter = new SimpleDateFormat("EEE HH:mm", Locale.US);
            long diffMinutes = TimeUnit.MILLISECONDS.toMinutes(formatter.parse(end).getTime() - formatter.parse(start).getTime()); 
            System.out.println(diffMinutes + " minutes");
        } catch(Exception ex) {
            ex.printStackTrace();
        }

    }

}

Java没有表示一周中某个时间(一周中的某一天和一天中的某一时间)的类型。我建议:

  • 使用java.time,现代java日期和时间API
  • 设计一个类来代表你的时代
  • 在你的课堂内部,你的时间只代表你决定的某个星期的特定日期和时间。这将为您提供以分钟为单位的免费排序和差异
您的类可能如下所示:

/** A time of week like "MON 17:00". In other words a day of week and time of day. */
public class TimeOfWeek implements Comparable<TimeOfWeek> {

    private static DateTimeFormatter dayTimeFormatter = new DateTimeFormatterBuilder()
            .parseCaseInsensitive()
            .appendPattern("EEE H:mm")
            .toFormatter(Locale.ENGLISH);
    /** First day of the week used internally for date-times, Sun Dec 28, 1969 */
    private static LocalDate firstDate 
            = LocalDate.EPOCH.with(TemporalAdjusters.previousOrSame(DayOfWeek.SUNDAY));

    /**
     * Internal representation;
     * always within the week of the epoch, Sun Dec 28, 1969 through Sat Jan 3, 1970.
     */
    private LocalDateTime dateTime;

    public TimeOfWeek(String dayTimeString) {
        TemporalAccessor parsed = dayTimeFormatter.parse(dayTimeString);
        DayOfWeek dow = DayOfWeek.from(parsed);
        LocalTime time = LocalTime.from(parsed);
        dateTime = firstDate.with(TemporalAdjusters.nextOrSame(dow)).atTime(time);
        assert ! dateTime.isBefore(firstDate.atStartOfDay()) : dateTime;
        assert dateTime.isBefore(firstDate.plusWeeks(1).atStartOfDay()) : dateTime;
    }

    /** The order is by day of week, Sunday first, then by time of day. */
    @Override
    public int compareTo(TimeOfWeek other) {
        return this.dateTime.compareTo(other.dateTime);
    }

    /** @return The difference in minutes between this and other (signed) */
    int minutesUntil(TimeOfWeek other) {
        return Math.toIntExact(ChronoUnit.MINUTES.between(this.dateTime, other.dateTime));
    }

    @Override
    public String toString() {
        return dateTime.format(dayTimeFormatter);
    }
}
输出:

[周日0:00,周一17:00,周二5:00,周六23:59]

要查找排序列表中对象之间的成对差异,请执行以下操作:

    for (int i = 1; i < dayTimes.size(); i++) {
        TimeOfWeek start = dayTimes.get(i - 1);
        TimeOfWeek end = dayTimes.get(i);
        System.out.println("Difference between " + start + " and " + end + ": "
                + start.minutesUntil(end) + " minutes");
    }

链接:解释如何使用
java.time

如果不允许使用SimpleDataFormat,最好使用ApacheLang3

import java.util.Arrays;
import java.util.Collections;
import java.util.Date;
import java.util.List;
import java.util.Locale;
import java.util.concurrent.TimeUnit;

import org.apache.commons.lang3.time.DateUtils;

public class DateCompare {

    public static void main(String[] args) {
        try {
            final String start = "MON 17:00";
            final String end = "Tue 5:00";
            List<Date> dates = Arrays.asList(DateUtils.parseDate(start, Locale.US, "EEE HH:mm"), DateUtils.parseDate(end, Locale.US, "EEE HH:mm"));
            Collections.sort(dates);
            long diffMinutes = TimeUnit.MILLISECONDS.toMinutes(dates.get(1).getTime() - dates.get(0).getTime()); 
            System.out.println(diffMinutes + " minutes");
        } catch(Exception ex) {
            ex.printStackTrace();
        }

    }

}
导入java.util.array;
导入java.util.Collections;
导入java.util.Date;
导入java.util.List;
导入java.util.Locale;
导入java.util.concurrent.TimeUnit;
导入org.apache.commons.lang3.time.DateUtils;
公共类日期比较{
公共静态void main(字符串[]args){
试一试{
最终字符串开始=“周一17:00”;
最终字符串结束=“星期二5:00”;
List dates=Arrays.asList(DateUtils.parseDate(start,Locale.US,“EEE HH:mm”)、DateUtils.parseDate(end,Locale.US,“EEE HH:mm”);
集合。排序(日期);
long diffMinutes=TimeUnit.millides.toMinutes(dates.get(1).getTime()-dates.get(0).getTime());
System.out.println(diffMinutes+“minutes”);
}捕获(例外情况除外){
例如printStackTrace();
}
}
}

那么您的预期输出是,
12小时
?哪个星期一?21日?28号星期一?哪个月?哪一年?@RoshanaPitigala小步舞曲的不同,对不起,我会的update@Ryotsu问题只出现在一周内,因此“SUN 00:00”是最早的,而“SAT 23:59”是最快的。您不应该使用
日历
简化格式
。这些课程设计拙劣,现在早已过时。你想要的。它对计算时间差也有更好的支持。这太棒了!我找不到EEE简单的日期格式!最后一件事。我如何从最早到最晚对它们进行分类?(离题)由于声誉低下,垃圾无法升级。请不要教年轻人使用早已过时且臭名昭著的
SimpleDateFormat
类。至少不是第一个选择。而且不是毫无保留的。今天,我们在及其
DateTimeFormatter
中有了更好的功能。
Difference between Sun 0:00 and Mon 17:00: 2460 minutes
Difference between Mon 17:00 and Tue 5:00: 720 minutes
Difference between Tue 5:00 and Sat 23:59: 6899 minutes
import java.util.Arrays;
import java.util.Collections;
import java.util.Date;
import java.util.List;
import java.util.Locale;
import java.util.concurrent.TimeUnit;

import org.apache.commons.lang3.time.DateUtils;

public class DateCompare {

    public static void main(String[] args) {
        try {
            final String start = "MON 17:00";
            final String end = "Tue 5:00";
            List<Date> dates = Arrays.asList(DateUtils.parseDate(start, Locale.US, "EEE HH:mm"), DateUtils.parseDate(end, Locale.US, "EEE HH:mm"));
            Collections.sort(dates);
            long diffMinutes = TimeUnit.MILLISECONDS.toMinutes(dates.get(1).getTime() - dates.get(0).getTime()); 
            System.out.println(diffMinutes + " minutes");
        } catch(Exception ex) {
            ex.printStackTrace();
        }

    }

}