为什么我在某一天的某一天得到了错误的一天?

时间:2016-10-25 19:16:05

标签: java date calendar simpledateformat

我试图获得与日期相对应的星期几。 我使用 Java日历 SimpleDateFormat

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

  • 2016-10-09(星期日)(这是星期天)
  • 2016-10-10(星期五)(星期一)

代码:

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 * / p>

为什么星期五?星期天是星期一的第二天!

2 个答案:

答案 0 :(得分:1)

将格式化程序字符串更改为 yyyy-MM-dd ,将天数数组更改为星期日

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");
    }
}

答案 1 :(得分:1)

TL;博士

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

周一

请参阅此code run live at IdeOne.com

java.time

您正在使用旧的日期时间类,现在是旧的,取而代之的是java.time类。现代课程更加简单。

Table of date-time types in Java, both modern and legacy.

无需指定格式设置模式,因为您输入的内容符合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 |周日

     

2016-10-10 |星期一

为了好玩,同样的事情在加拿大法语。

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框架内置于Java 8及更高版本中。这些类取代了麻烦的旧legacy日期时间类,例如java.util.DateCalendar和& SimpleDateFormat

要了解详情,请参阅Oracle Tutorial。并搜索Stack Overflow以获取许多示例和解释。规范是JSR 310

现在位于Joda-Timemaintenance mode项目建议迁移到java.time类。

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

从哪里获取java.time类?

ThreeTen-Extra项目使用其他类扩展java.time。该项目是未来可能添加到java.time的试验场。您可以在此处找到一些有用的课程,例如IntervalYearWeekYearQuartermore