我想要获得与日期相对应的星期几。我正在使用Java的Calendar和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周日
2016-10-10星期五
将格式化程序字符串更改为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");
}
}
LocalDate.parse( "2016-10-10" )
.getDayOfWeek()
.getDisplayName( TextStyle.FULL , Locale.US )
星期一
看到这个code run live at IdeOne.com。
您正在使用旧的日期时间类,现在是旧的,由java.time类取代。现代课程更简单。
无需指定格式化模式,因为您输入的内容符合java.time类中默认使用的ISO 8601标准。这可以避免原始代码中的错误解析问题。
LocalDate ld = LocalDate.parse( "2016-10-10" ) ;
DayOfWeek
枚举定义了七个对象,一个星期的每一天。在代码中使用这些代替数字或字符串。
DayOfWeek dow = ld.getDayOfWeek();
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。
java.time框架内置于Java 8及更高版本中。这些类取代了麻烦的旧legacy日期时间类,如java.util.Date
,Calendar
和SimpleDateFormat
。
要了解更多信息,请参阅Oracle Tutorial。并搜索Stack Overflow以获取许多示例和解释。规格是JSR 310。
现在在Joda-Time的maintenance mode项目建议迁移到java.time班。
您可以直接与数据库交换java.time对象。使用符合JDBC driver或更高版本的JDBC 4.2。不需要字符串,不需要java.sql.*
类。
从哪里获取java.time类?
ThreeTen-Extra项目使用其他类扩展了java.time。该项目是未来可能添加到java.time的试验场。你可能会在这里找到一些有用的类,如Interval
,YearWeek
,YearQuarter
和more。