为什么我在某个特定日期得到了错误的一周?

问题描述 投票:-1回答:2

我想要获得与日期相对应的星期几。我正在使用Java的Calendar和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周日

2016-10-10星期五

为何周五?星期天是星期一的第二天!

java date calendar simpledateformat
2个回答
1
投票

将格式化程序字符串更改为yyyy-MM-dd,将days数组更改为以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");
    }
}

1
投票

tl;dr

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

星期一

看到这个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 |星期日

2016-10-10 |星期一

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

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

2016-10-10 |星期一

this code in action in ideone.com


About java.time

java.time框架内置于Java 8及更高版本中。这些类取代了麻烦的旧legacy日期时间类,如java.util.DateCalendarSimpleDateFormat

要了解更多信息,请参阅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

© www.soinside.com 2019 - 2024. All rights reserved.