我收到的是String
,这是一周中的拼写日期,例如:星期一。现在我想得到那天的常量整数表示,它在java.util.Calendar
中使用。
我真的必须自己做if(day.equalsIgnoreCase("Monday")){...}else if(...){...}
吗?有一些简洁的方法吗?如果我挖出SimpleDateFormat
并将其与Calendar
混合,我生成的行几乎与键入丑陋的if-else-infitity statetment一样多。
答案 0 :(得分:9)
您可以使用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);
}
}
答案 1 :(得分:5)
对于任何对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
答案 2 :(得分:3)
我通常使用枚举,但在这种情况下,你的输入必须是正确的。
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
答案 3 :(得分:1)
你可以这样做:
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;
}
答案 4 :(得分: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以上版本。
答案 5 :(得分:1)
对于非英语星期几的名称,请参阅Answer by tete。
DayOfWeek.valueOf( "Monday".toUppercase() ) // `DayOfWeek` object. Works only for English language.
.getValue() // 1
如果您的星期几名称恰好是英文(周一,周二等)的全名,那么恰好与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
课程,本地化才是单向的。要使用英语以外的语言转到另一个方向,请参阅Answer by tete。
java.time框架内置于Java 8及更高版本中。这些类取代了麻烦的旧legacy日期时间类,例如java.util.Date
,Calendar
和&amp; SimpleDateFormat
现在位于Joda-Time的maintenance mode项目建议迁移到java.time类。
要了解详情,请参阅Oracle Tutorial。并搜索Stack Overflow以获取许多示例和解释。规范是JSR 310。
从哪里获取java.time类?
ThreeTen-Extra项目使用其他类扩展java.time。该项目是未来可能添加到java.time的试验场。您可以在此处找到一些有用的课程,例如Interval
,YearWeek
,YearQuarter
和more。
答案 6 :(得分:0)
为什么不初始化你想要的东西?
private static final Map<String, Integer> weekDays;
static
{
weekDays= new HashMap<String, Integer>();
weekDays.put("Monday", Calendar.MONDAY);
weekDays.put("Tuesday", Calendar.TUESDAY);
// etc
}
答案 7 :(得分:0)
为什么不申报地图:
Map<String, Integer> daysMap = new HashMap<String, Integer>();
daysMap.add("monday", 0);
daysMap.add("tuesday", 1);
//etc.
然后,当您需要搜索时:
int dayId = daysMap.get(day.toLowerCase());
这应该做你需要的。您甚至可以从某个文件/数据库等加载数据。
答案 8 :(得分:0)
如果您使用的是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());
对于旧版本,请查看以下答案: Convert string to day of week (not exact date)
答案 9 :(得分:0)
使用private static final List dayNames = Arrays.asList(new DateFormatSymbols().getWeekdays());
public int dayNameToInteger(String dayName) {
return dayNames.indexOf(dayName) - 1;
}
类中内置的名称,如下所示。这对于星期日返回0,对于星期六返回6,对于任何无效日返回-2。根据需要添加自己的错误处理。
#define VK_LSHIFT 0xA0
#define VK_RSHIFT 0xA1
#define VK_LCONTROL 0xA2
#define VK_RCONTROL 0xA3
#define VK_LMENU 0xA4
#define VK_RMENU 0xA5