在 Java 中从星期一到星期日按星期几排序

Sort by day of the week from Monday to Sunday in Java

我有以下格式的一天。

"Fri 05:00"
"Tue 10:15"
"Mon 02:00"

我想对从周一到周日开始的这一天进行排序。

我尝试将此日期格式化为

SimpleDateFormat format = new SimpleDateFormat("EEE hh:mm");

然后我创建了这些日期的列表。然后我在 Comparator 中使用了 Calendar.DAY_OF_WEEK 但它是从星期日而不是星期一开始的日期排序的。

日历有方法

setFirstDayOfWeek(ind day)

你可以使用它:calendar.setFirstDayOfWeek(Calendar.Monday)

定义一个class

没有 class 与 Java 捆绑在一起来表示星期几和一天中的时间。捆绑的 class 需要一个日期。

您将需要定义自己的 class,也许命名为 DayOfWeekWithTime。 class 将有两个成员字段,一个 DayOfWeek object and a LocalTime 对象。在 Stack Overflow 中搜索关于这些 class 的许多现有帖子。

public class DayOfWeekWithTime {
    // Member fields
    DayOfWeek dayOfWeek ;
    LocalTime localTime ;

    // Constructor
    public DayOfWeekWithTime ( DayOfWeek dayOfWeek , LocalTime localTime ) {
        Objects.requireNonNull( dayOfWeek ) ;
        Objects.requireNonNull( localTime ) ;
        this.dayOfWeek = dayOfWeek ;
        this.localTime = localTime ;
    }
}

DayOfWeek 枚举遵循 ISO 8601 标准,因此周定义为周一至周日。这符合您想要的排序顺序。因此,您可以按该成员字段对 DayOfWeekWithTime 对象的集合进行排序。参见 Collections.sort( list , comparator )。在 Stack Overflow 中搜索有关按特定字段对对象排序主题的许多现有帖子。

如问题中所示,要从字符串输入中实例化您的 DayOfWeekWithTime 对象,请拆分 SPACE 字符。参见 String::split。在 Stack Overflow 中搜索许多关于拆分字符串主题的现有帖子。

然后编写一个例程来查找每个 3 字母输入值的 DayOfWeek 枚举。你可以写一个 if-else-if 系列。或者你可以写一个 Map< String , DayOfWeek >

对于一天中的时间,您可以使用LocalTime.parse 方法进行解析。如果使用 24 小时制并在单个数字上填充零,则无需定义格式模式,因为 java.time classes 默认使用标准 ISO 8601 格式当 parsing/generating 文本。在 Stack Overflow 中搜索有关使用 java.time classes.

进行解析的许多现有帖子

不要使用SimpleDateFormat或相关的可怕的日期时间class现在已经遗留,例如DateCalendar。仅使用 java.time classes 进行日期时间工作。


关于java.time

java.time framework is built into Java 8 and later. These classes supplant the troublesome old legacy date-time classes such as java.util.Date, Calendar, & SimpleDateFormat.

Joda-Time project, now in maintenance mode, advises migration to the java.time classes.

要了解更多信息,请参阅 Oracle Tutorial. And search Stack Overflow for many examples and explanations. Specification is JSR 310

您可以直接与您的数据库交换 java.time 对象。使用 JDBC driver compliant with JDBC 4.2 或更高版本。不需要字符串,不需要 java.sql.* classes.

从哪里获得java.time classes?

ThreeTen-Extra project extends java.time with additional classes. This project is a proving ground for possible future additions to java.time. You may find some useful classes here such as Interval, YearWeek, YearQuarter, and more.