为什么我在某个日期得到错误的星期几?

Why i'm i getting the wrong day of the week for a certain date?

我正在尝试获取与日期相对应的星期几。 我正在使用 Java 的日历 SimpleDateFormat.

但是我得到了错误的输出。例如,对于这个日期:

代码:

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;

public class test {
    public static void main(String[] args) throws ParseException {
        String[] days = {"Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday", "Sunday"};
        String date1 = "**2016-10-09**";
        String date2 = "**2016-10-10**";
        Date d1 = new SimpleDateFormat("yyyy-Mm-Dd").parse( date1 );
        Date d2 = new SimpleDateFormat("yyyy-Mm-Dd").parse( date2 );
        Calendar cal = Calendar.getInstance();
        cal.setTime(d1);
        String day1 = days[cal.get(Calendar.DAY_OF_WEEK)-1];
        cal = Calendar.getInstance();
        cal.setTime(d2);
        String day2 = days[cal.get(Calendar.DAY_OF_WEEK)-1];
        System.out.printf(date1+" "+day1+"\n"+date2+" "+day2);
    }
}

输出:

2016-10-09 Sunday

2016-10-10 Friday

为什么是星期五?周日的后一天是周一!

将格式化程序字符串更改为 yyyy-MM-dd 并将日期数组更改为以 sunday

开头
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;

public class Main {
    public static void main(String[] args) throws ParseException {
        String[] days = {"Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"};
        String date1 = "2016-10-09";
        String date2 = "2016-10-10";
        Date d1 = new SimpleDateFormat("yyyy-MM-dd").parse( date1 );
        Date d2 = new SimpleDateFormat("yyyy-MM-dd").parse( date2 );
        Calendar cal = Calendar.getInstance();
        cal.setTime(d1);

        String day1 = days[cal.get(Calendar.DAY_OF_WEEK)-1];
        System.out.printf(date1+" "+day1+"\n");
        cal = Calendar.getInstance();
        cal.setTime(d2);
        String day2 = days[cal.get(Calendar.DAY_OF_WEEK)-1];
        System.out.printf(date1+" "+day1+"\n");
    }
}

tl;博士

LocalDate.parse( "2016-10-10" )
         .getDayOfWeek()  
         .getDisplayName( TextStyle.FULL , Locale.US )

Monday

看到这个code run live at IdeOne.com

java.time

您使用的是旧日期时间 类,现在是旧日期时间,已被 java.time 类 取代。使用现代 类.

更简单

无需指定格式模式,因为您的输入符合 java.time 类 默认使用的 ISO 8601 标准.这样就避免了你原来的代码解析不正确的问题。

LocalDate ld = LocalDate.parse( "2016-10-10" ) ;

DayOfWeek 枚举定义了七个对象,一个对应一周中的每一天。在您的代码中使用这些代替数字或字符串。

DayOfWeek dow = ld.getDayOfWeek();

localized name of the day.

String output = dow.getDisplayName( TextStyle.FULL , Locale.US );  // Or Locale.CANADA_FRENCH etc.

完整示例

分别解析两个有问题的日期。

LocalDate ld09 = LocalDate.parse( "2016-10-09" ) ;
LocalDate ld10 = LocalDate.parse( "2016-10-10" ) ;

生成每个日期的星期几的显示名称。

String output09 = ld09 + " | " + 
    ld09.getDayOfWeek().getDisplayName( TextStyle.FULL , Locale.US ) ;
String output10 = ld10 + " | " + 
    ld10.getDayOfWeek().getDisplayName( TextStyle.FULL , Locale.US ) ;

转储到控制台。

System.out.println( output09 );
System.out.println( output10 );

2016-10-09 | Sunday

2016-10-10 | Monday

为了好玩,加拿大法语也一样。

String output10_Québec = ld10 + " | " + 
    ld10.getDayOfWeek().getDisplayName( TextStyle.FULL , Locale.CANADA_FRENCH  ) ;

2016-10-10 | lundi

参见 this code in action in ideone.com


关于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.

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

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

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

java.time类在哪里获取?

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.