将字符串转换为星期几(不是确切的日期)

我收到一个String ,这是一周的拼写日,例如星期一。 现在我想获得当天的常量整数表示,它在java.util.Calendar

我是否真的必须做if(day.equalsIgnoreCase("Monday")){...}else if(...){...}我自己? 有一些简洁的方法吗? 如果我挖掘SimpleDateFormat并将其与Calendar混合,我生成的行几乎与键入丑陋的if-else-to-infitity statetment一样多。

您可以使用SimpleDateFormat它还可以解析特定Locale

 public class Main { private static int parseDayOfWeek(String day, Locale locale) throws ParseException { SimpleDateFormat dayFormat = new SimpleDateFormat("E", locale); Date date = dayFormat.parse(day); Calendar calendar = Calendar.getInstance(); calendar.setTime(date); int dayOfWeek = calendar.get(Calendar.DAY_OF_WEEK); return dayOfWeek; } public static void main(String[] args) throws ParseException { int dayOfWeek = parseDayOfWeek("Sunday", Locale.US); System.out.println(dayOfWeek); dayOfWeek = parseDayOfWeek("Tue", Locale.US); System.out.println(dayOfWeek); dayOfWeek = parseDayOfWeek("Sonntag", Locale.GERMANY); System.out.println(dayOfWeek); } } 

我通常使用枚举,但在这种情况下,你的输入必须是正确的。

 public enum DayOfWeek { Sunday(1),Monday(2),Tuesday(3),Wednesday(4),Thursday(5),Friday(6),Saturday(7); private final int value; DayOfWeek(int value) { this.value = value; } public int getValue() { return value; } @Override public String toString() { return value + ""; } } 

现在,您可以按如下方式获取星期几:

 String sunday = "Sunday"; System.out.println(DayOfWeek.valueOf(sunday)); 

这会给你以下输出:

 1 

java.time

对于任何对Java 8解决方案感兴趣的人,可以通过以下类似的方式实现:

 import static java.util.Locale.forLanguageTag; import java.time.format.DateTimeFormatter; import java.time.temporal.TemporalAccessor; import java.time.DayOfWeek; import org.junit.Test; public class sarasa { @Test public void test() { DateTimeFormatter formatter = DateTimeFormatter.ofPattern("EEEE", forLanguageTag("es")); TemporalAccessor accessor = formatter.parse("martes"); // Spanish for Tuesday. System.out.println(DayOfWeek.from(accessor)); } } 

输出为:

 TUESDAY 

你可以这样做:

  private static String getDayOfWeek(final Calendar calendar){ assert calendar != null; final String[] days = {"Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"}; return days[calendar.get(Calendar.DAY_OF_WEEK)-1]; } 

虽然声明一周的日期可能是个好主意,所以每次调用方法时都不必继续声明它们。

换句话说,这样的事情:

  private static int getDayOfWeek(final String day){ assert day != null; final String[] days = {"Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"}; for(int i = 0; i < days.length; i++) if(days[i].equalsIgnoreCase(day)) return i+1; return -1; } 

考虑使用类似的辅助方法

 public static int getDayOfWeekAsInt(String day) { if (day == null) { return -1; } switch (day.toLowerCase()) { case "monday": return Calendar.MONDAY; case "tuesday": return Calendar.TUESDAY; case "wednesday": return Calendar.WEDNESDAY; case "thursday": return Calendar.THURSDAY; case "friday": return Calendar.FRIDAY; case "saturday": return Calendar.SATURDAY; case "sunday": return Calendar.SUNDAY; default: return -1; } } 

请注意,使用带有switch-case字符串仅支持Java 7以上版本。

对于非英语星期几的名称,请参阅答案 。

TL;博士

  DayOfWeek.valueOf( "Monday".toUppercase() ) // `DayOfWeek` object. Works only for English language. .getValue() // 1 

java.time

如果您的星期几名称恰好是英文(周一,周二等)的全名,那么恰好与DayOfWeek枚举中定义的枚举对象的名称一致。

将输入转换为全部大写,并解析以获取该星期几的常量对象。

 String input = "Monday" ; String inputUppercase = input.toUppercase() ; // MONDAY DayOfWeek dow = DayOfWeek.valueOf( inputUppercase ); // Object, neither a string nor a number. 

现在我们有一个完整的特征对象而不是一个字符串,请求周日为1且星期日为7(标准ISO 8601定义)的星期几的整数。

 int dayOfWeekNumber = dow.getValue() ; 

使用DayOfWeek对象而不是字符串

我强烈建议您尽量减少使用星期几的名称或数量。 相反,尽可能使用DayOfWeek对象

顺便说一句,您可以自动本地化星期几的名称。

 String output = DayOfWeek.MONDAY.getDisplayName( TextStyle.FULL , Locale.CANADA_FRENCH ); 

这种本地化只能通过DayOfWeek类进行单向操作。 要使用英语以外的语言转到另一个方向,请参阅答案 。


关于java.time

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

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

要了解更多信息,请参阅Oracle教程 。 并搜索Stack Overflow以获取许多示例和解释。 规范是JSR 310 。

从哪里获取java.time类?

  • Java SE 8SE 9及更高版本
    • 内置。
    • 带有捆绑实现的标准Java API的一部分。
    • Java 9增加了一些小function和修复。
  • Java SE 6SE 7
    • 许多java.timefunction都被反向移植到ThreeTen-Backport中的 Java 6和7。
  • Android的
    • ThreeTenABP项目特别适用于Android的ThreeTen-Backport (如上所述)。
    • 请参见如何使用ThreeTenABP ….

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

为什么不初始化你想要的一次?

 private static final Map weekDays; static { weekDays= new HashMap(); weekDays.put("Monday", Calendar.MONDAY); weekDays.put("Tuesday", Calendar.TUESDAY); // etc } 

为什么不申报地图:

 Map daysMap = new HashMap(); daysMap.add("monday", 0); daysMap.add("tuesday", 1); //etc. 

然后,当您需要搜索时:

 int dayId = daysMap.get(day.toLowerCase()); 

这应该做你需要的。 您甚至可以从某个文件/数据库等加载数据。

如果您使用的是Java 8:

 import java.time.DayOfWeek; 

然后简单地使用:DayOfWeek。[DAY] .getValue()

 System.out.println(DayOfWeek.MONDAY.getValue()); System.out.println(DayOfWeek.TUESDAY); System.out.println(DayOfWeek.FRIDAY.getValue()); 

对于旧版本,请检查以下答案: 将字符串转换为星期几(不是确切日期)

使用DateFormatSymbols类中内置的名称,如下所示。 这为星期日返回0,星期六返回6,对任何无效日返回-2。 根据需要添加自己的error handling。

 private static final List dayNames = Arrays.asList(new DateFormatSymbols().getWeekdays()); public int dayNameToInteger(String dayName) { return dayNames.indexOf(dayName) - 1; }