如何确定通过特定date的星期几?

例如,我有date:“23/2/2010”(2010年2月23日)。 我想把它传递给一个将返回星期几的函数。 我该怎么做?

在这个例子中,函数应该返回String “Tue”。

此外,如果只需要一天的序数,那么如何检索呢?

是。 根据您的确切情况:

  • 你可以使用java.util.Calendar

     Calendar c = Calendar.getInstance(); c.setTime(yourDate); int dayOfWeek = c.get(Calendar.DAY_OF_WEEK); 
  • 如果你需要的输出是Tue而不是3(星期几从1开始),而不是通过一个日历,只需重新格式化string: new SimpleDateFormat("EE").format(date)EE意思是“星期几,短版“)

  • 如果你有你的input作为string,而不是Date ,你应该使用SimpleDateFormat来parsing它: new SimpleDateFormat("dd/M/yyyy").parse(dateString)

  • 您可以使用joda-time的DateTime并调用dateTime.dayOfWeek()和/或DateTimeFormat

  String input_date="01/08/2012"; SimpleDateFormat format1=new SimpleDateFormat("dd/MM/yyyy"); Date dt1=format1.parse(input_date); DateFormat format2=new SimpleDateFormat("EEEE"); String finalDay=format2.format(dt1); 

使用此代码从inputdate中查找date名称。简单且经过充分testing。

只需使用SimpleDateFormat stufs 🙂

 SimpleDateFormat newDateFormat = new SimpleDateFormat("dd/MM/yyyy"); Date MyDate = newDateFormat.parse("28/12/2013"); newDateFormat.applyPattern("EEEE d MMM yyyy") String MyDate = newDateFormat.format(MyDate); 

结果是: 2013年12月28日星期六

如果你想要不同的位置,只需要在applyPattern方法中replace它。

但是如果你只想在一周中的某一天留下这样的话:

 newDateFormat.applyPattern("EEEE") 

TL;博士

使用java.time …

 LocalDate.parse( // Generate `LocalDate` object from String input. "23/2/2010" , DateTimeFormatter.ofPattern( "d/M/uuuu" ) ) .getDayOfWeek() // Get `DayOfWeek` enum object. .getDisplayName( // Localize. Generate a String to represent this day-of-week. TextStyle.SHORT_STANDALONE , // How long or abbreviated. Some languages have an alternate spelling for "standalone" use (not so in English). Locale.US // Or Locale.CANADA_FRENCH and such. Specify a `Locale` to determine (1) human language for translation, and (2) cultural norms for abbreviation, punctuation, etc. ) 

星期二

在IdeOne.com上看到这个代码运行 (但只有Locale.US在那里工作)。

java.time

看到我上面的示例代码,并看到Przemek的java.time正确的答案 。

序数词

如果只需要一天的序数,那么如何才能找回?

对于序号,考虑传递DayOfWeek枚举对象,而不是像DayOfWeek.TUESDAY 。 请记住, DayOfWeek是一个聪明的对象,不只是一个string或纯粹的整数。 使用这些枚举对象可以使您的代码更加自我logging,确保有效的值并提供types安全性 。

但是,如果你坚持, 问DayOfWeek一个数字 。 根据ISO 8601标准,星期一至星期天您会得到1-7。

 int ordinal = myLocalDate.getDayOfWeek().getValue() ; 

乔达时间

更新: Joda-Time项目现在处于维护模式。 团队build议迁移到java.time类。 java.time框架内置于Java 8中(以及移植到Java 6和7,并进一步适用于Android )。

Bozho接受的答案中提到了使用Joda-Time库版本2.4的示例代码。 Joda-Time远远优于Java捆绑的java.util.Date/.Calendar类。

LocalDate

Joda-Time提供LocalDate类来代表仅限date而不需要任何时间或时区。 正是这个问题所要求的。 与Java捆绑在一起的旧的java.util.Date/.Calendar类缺乏这个概念。

parsing

将stringparsing为date值。

 String input = "23/2/2010"; DateTimeFormatter formatter = DateTimeFormat.forPattern( "d/M/yyyy" ); LocalDate localDate = formatter.parseLocalDate( input ); 

提取

从date值中提取星期几的号码和名称。

 int dayOfWeek = localDate.getDayOfWeek(); // Follows ISO 8601 standard, where Monday = 1, Sunday = 7. Locale locale = Locale.US; // Locale specifies the human language to use in determining day-of-week name (Tuesday in English versus Mardi in French). DateTimeFormatter formatterOutput = DateTimeFormat.forPattern( "E" ).withLocale( locale ); String output = formatterOutput.print( localDate ); // 'E' is code for abbreviation of day-of-week name. See Joda-Time doc. String outputQuébécois = formatterOutput.withLocale( Locale.CANADA_FRENCH ).print( localDate ); 

倾倒

转储到控制台。

 System.out.println( "input: " + input ); System.out.println( "localDate: " + localDate ); // Defaults to ISO 8601 formatted strings. System.out.println( "dayOfWeek: " + dayOfWeek ); System.out.println( "output: " + output ); System.out.println( "outputQuébécois: " + outputQuébécois ); 

运行时。

 input: 23/2/2010 localDate: 2010-02-23 dayOfWeek: 2 output: Tue outputQuébécois: mar. 

关于java.time

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

Joda-Time项目现在处于维护模式 ,build议迁移到java.time类。

要了解更多信息,请参阅Oracle教程 。 并search堆栈溢出了很多例子和解释。 规范是JSR 310 。

从何处获取java.time类?

  • Java SE 8Java SE 9和更高版本
    • 内置。
    • 带有捆绑实现的标准Java API的一部分。
    • Java 9增加了一些小function和修复。
  • Java SE 6Java SE 7
    • 大部分的java.timefunction都被移植到了ThreeTen-Backport中的 Java 6&7中。
  • Android的
    • ThreeTenABP项目专门针对Android,采用了ThreeTen-Backport (上文提到)。
    • 请参阅如何使用ThreeTenABP …。

ThreeTen-Extra项目将java.time扩展到其他类。 这个项目是未来可能增加java.time的一个试验场。 你可能会在这里find一些有用的类,比如IntervalYearWeekYearQuarter 等等 。

java.time

使用Java 8及更高版本中内置的java.time框架。

DayOfWeek 枚举可以生成当天名称的string,自动本地化为Locale的人类语言和文化规范。 指定一个TextStyle来表明你想要长forms或缩写名称。

 import java.time.LocalDate import java.time.format.DateTimeFormatter import java.time.format.TextStyle import java.util.Locale DateTimeFormatter formatter = DateTimeFormatter.ofPattern("d/M/yyyy"); LocalDate date = LocalDate.parse("23/2/2010", formatter); // LocalDate = 2010-02-23 DayOfWeek dow = date.getDayOfWeek(); // Extracts a `DayOfWeek` enum object. String output = dow.getDisplayName(TextStyle.SHORT, Locale.US); // String = Tue 

另一种“有趣”的方式是使用末日algorithm 。 这是一个更长的方法,但它也更快,如果你不需要创build一个给定date的日历对象。

 import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.Calendar; import java.util.HashMap; import java.util.Map; import java.util.Random; /** * * @author alain.janinmanificat */ public class Doomsday { public static HashMap<Integer, ArrayList<Integer>> anchorDaysMap = new HashMap<>(); public static HashMap<Integer, Integer> doomsdayDate = new HashMap<>(); public static String weekdays[] = new DateFormatSymbols(Locale.FRENCH).getWeekdays(); /** * @param args the command line arguments */ public static void main(String[] args) throws ParseException, ParseException { // Map is fed manually but we can use this to calculate it : http://en.wikipedia.org/wiki/Doomsday_rule#Finding_a_century.27s_anchor_day anchorDaysMap.put(Integer.valueOf(0), new ArrayList<Integer>() { { add(Integer.valueOf(1700)); add(Integer.valueOf(2100)); add(Integer.valueOf(2500)); } }); anchorDaysMap.put(Integer.valueOf(2), new ArrayList<Integer>() { { add(Integer.valueOf(1600)); add(Integer.valueOf(2000)); add(Integer.valueOf(2400)); } }); anchorDaysMap.put(Integer.valueOf(3), new ArrayList<Integer>() { { add(Integer.valueOf(1500)); add(Integer.valueOf(1900)); add(Integer.valueOf(2300)); } }); anchorDaysMap.put(Integer.valueOf(5), new ArrayList<Integer>() { { add(Integer.valueOf(1800)); add(Integer.valueOf(2200)); add(Integer.valueOf(2600)); } }); //Some reference date that always land on Doomsday doomsdayDate.put(Integer.valueOf(1), Integer.valueOf(3)); doomsdayDate.put(Integer.valueOf(2), Integer.valueOf(14)); doomsdayDate.put(Integer.valueOf(3), Integer.valueOf(14)); doomsdayDate.put(Integer.valueOf(4), Integer.valueOf(4)); doomsdayDate.put(Integer.valueOf(5), Integer.valueOf(9)); doomsdayDate.put(Integer.valueOf(6), Integer.valueOf(6)); doomsdayDate.put(Integer.valueOf(7), Integer.valueOf(4)); doomsdayDate.put(Integer.valueOf(8), Integer.valueOf(8)); doomsdayDate.put(Integer.valueOf(9), Integer.valueOf(5)); doomsdayDate.put(Integer.valueOf(10), Integer.valueOf(10)); doomsdayDate.put(Integer.valueOf(11), Integer.valueOf(7)); doomsdayDate.put(Integer.valueOf(12), Integer.valueOf(12)); long time = System.currentTimeMillis(); for (int i = 0; i < 100000; i++) { //Get a random date int year = 1583 + new Random().nextInt(500); int month = 1 + new Random().nextInt(12); int day = 1 + new Random().nextInt(7); //Get anchor day and DoomsDay for current date int twoDigitsYear = (year % 100); int century = year - twoDigitsYear; int adForCentury = getADCentury(century); int dd = ((int) twoDigitsYear / 12) + twoDigitsYear % 12 + (int) ((twoDigitsYear % 12) / 4); //Get the gap between current date and a reference DoomsDay date int referenceDay = doomsdayDate.get(month); int gap = (day - referenceDay) % 7; int result = (gap + adForCentury + dd) % 7; if(result<0){ result*=-1; } String dayDate= weekdays[(result + 1) % 8]; //System.out.println("day:" + dayDate); } System.out.println("time (ms) : " + (System.currentTimeMillis() - time)); //time (ms) : 80 time = System.currentTimeMillis(); for (int i = 0; i < 100000; i++) { Calendar c = Calendar.getInstance(); //I should have used random date here too, but it's already slower this way c.setTime(new SimpleDateFormat("dd/MM/yyyy").parse("12/04/1861")); // System.out.println(new SimpleDateFormat("EE").format(c.getTime())); int result2 = c.get(Calendar.DAY_OF_WEEK); // System.out.println("day idx :"+ result2); } System.out.println("time (ms) : " + (System.currentTimeMillis() - time)); //time (ms) : 884 } public static int getADCentury(int century) { for (Map.Entry<Integer, ArrayList<Integer>> entry : anchorDaysMap.entrySet()) { if (entry.getValue().contains(Integer.valueOf(century))) { return entry.getKey(); } } return 0; } } 
 public class TryDateFormats { public static void main(String[] args) throws ParseException { String month = "08"; String day = "05"; String year = "2015"; String inputDateStr = String.format("%s/%s/%s", day, month, year); Date inputDate = new SimpleDateFormat("dd/MM/yyyy").parse(inputDateStr); Calendar calendar = Calendar.getInstance(); calendar.setTime(inputDate); String dayOfWeek = calendar.getDisplayName(Calendar.DAY_OF_WEEK, Calendar.LONG, Locale.US).toUpperCase(); System.out.println(dayOfWeek); } } 
 ... import java.time.LocalDate; ... //String month = in.next(); int mm = in.nextInt(); //String day = in.next(); int dd = in.nextInt(); //String year = in.next(); int yy = in.nextInt(); in.close(); LocalDate dt = LocalDate.of(yy, mm, dd); System.out.print(dt.getDayOfWeek()); 
 import java.text.SimpleDateFormat; import java.util.Scanner; class DayFromDate { public static void main(String args[]) { System.out.println("Enter the date(dd/mm/yyyy):"); Scanner scan=new Scanner(System.in); String Date=scan.nextLine(); try{ boolean dateValid=dateValidate(Date); if(dateValid==true) { SimpleDateFormat df = new SimpleDateFormat( "dd/MM/yy" ); java.util.Date date = df.parse(Date); df.applyPattern( "EEE" ); String day= df.format( date ); if(day.compareTo("Sat")==0|| day.compareTo("Sun")==0) { System.out.println(day+": Weekend"); } else { System.out.println(day+": Weekday"); } } else { System.out.println("Invalid Date!!!"); } } catch(Exception e) { System.out.println("Invalid Date Formats!!!"); } } static public boolean dateValidate(String d) { String dateArray[]= d.split("/"); int day=Integer.parseInt(dateArray[0]); int month=Integer.parseInt(dateArray[1]); int year=Integer.parseInt(dateArray[2]); System.out.print(day+"\n"+month+"\n"+year+"\n"); boolean leapYear=false; if((year % 4 == 0) && (year % 100 != 0) || (year % 400 == 0)) { leapYear=true; } if(year>2099 || year<1900) return false; if(month<13) { if(month==1||month==3||month==5||month==7||month==8||month==10||month==12) { if(day>31) return false; } else if(month==4||month==6||month==9||month==11) { if(day>30) return false; } else if(leapYear==true && month==2) { if(day>29) return false; } else if(leapYear==false && month==2) { if(day>28) return false; } return true; } else return false; } } 
 private String getDay(Date date){ SimpleDateFormat simpleDateFormat = new SimpleDateFormat("EEEE"); //System.out.println("DAY "+simpleDateFormat.format(date).toUpperCase()); return simpleDateFormat.format(date).toUpperCase(); } private String getDay(String dateStr){ //dateStr must be in DD-MM-YYYY Formate Date date = null; String day=null; try { date = new SimpleDateFormat("DD-MM-YYYY").parse(dateStr); SimpleDateFormat simpleDateFormat = new SimpleDateFormat("EEEE"); //System.out.println("DAY "+simpleDateFormat.format(date).toUpperCase()); day = simpleDateFormat.format(date).toUpperCase(); } catch (ParseException e) { // TODO Auto-generated catch block e.printStackTrace(); } return day; } 

你可以尝试下面的代码:

 import java.time.*; public class Test{ public static void main(String[] args) { DayOfWeek dow = LocalDate.of(2010,Month.FEBRUARY,23).getDayOfWeek(); String s = String.valueOf(dow); System.out.println(String.format("%.3s",s)); } } 
 Calendar cal = Calendar.getInstance(desired date); cal.setTimeInMillis(System.currentTimeMillis()); int dayOfWeek = cal.get(Calendar.DAY_OF_WEEK); 

通过提供当前时间戳来获取date值。

 LocalDate date=LocalDate.now(); System.out.println(date.getDayOfWeek());//prints THURSDAY System.out.println(date.getDayOfWeek().getDisplayName(TextStyle.SHORT, Locale.US) ); //prints Thu java.time.DayOfWeek is a enum which returns the singleton instance for the day-of-week of the weekday of the date. 

你可以使用下面的方法通过传递一个特定的date来获得星期几,

这里对于Calendar类的设置方法,Tricky部分是月份参数的索引将从0开始

 public static String getDay(int day, int month, int year) { Calendar cal = Calendar.getInstance(); if(month==1){ cal.set(year,0,day); }else{ cal.set(year,month-1,day); } int dow = cal.get(Calendar.DAY_OF_WEEK); switch (dow) { case 1: return "SUNDAY"; case 2: return "MONDAY"; case 3: return "TUESDAY"; case 4: return "WEDNESDAY"; case 5: return "THURSDAY"; case 6: return "FRIDAY"; case 7: return "SATURDAY"; default: System.out.println("GO To Hell...."); } return null; } 

程序通过使用java.util.scanner包提供用户inputdate月和年来查找星期几。

 import java.util.Scanner; public class Calender{ public static String getDay(String day, String month, String year) { int ym, yp, d, ay, a=0; int by = 20; int y[]=new int []{6,4,2,0}; int m[]=new int []{0,3,3,6,1,4,6,2,5,0,3,5}; String wd[] = {"Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"}; int gd=Integer.parseInt(day); int gm=Integer.parseInt(month); int gy=Integer.parseInt(year); ym=gy%100; yp=ym/4; ay=gy/100; while (ay!=by) { by=by+1; a=a+1; if(a==4) { a=0; } } if ((ym%4==0) && (gm==2)){ d=(gd+m[gm-1]+ym+yp+y[a]-1)%7; } else d = (gd+m[gm-1]+ym+yp+y[a])%7; return wd[d]; } public static void main(String[] args){ Scanner in = new Scanner(System.in); String day = in.next(); String month = in.next(); String year = in.next(); System.out.println(getDay(day, month, year)); } }