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

Java 将字符串转换为星期几(不是确切的日期),java,date,calendar,simpledateformat,dayofweek,Java,Date,Calendar,Simpledateformat,Dayofweek,我收到一个字符串,它是一周中指定的一天,例如星期一。现在我想得到那天的常量整数表示,它在java.util.Calendar中使用 我真的必须自己做if(day.equalsIgnoreCase(“星期一”){…}或者if(…){…}?有什么好办法吗?如果我把SimpleDateFormat和日历混合起来,我产生的行数几乎和在infitity语句中键入丑陋的If-else一样多。你可以这样做: private static String getDayOfWeek(final Calend

我收到一个
字符串
,它是一周中指定的一天,例如星期一。现在我想得到那天的常量整数表示,它在
java.util.Calendar
中使用


我真的必须自己做if(day.equalsIgnoreCase(“星期一”){…}或者if(…){…}?有什么好办法吗?如果我把
SimpleDateFormat
日历混合起来,我产生的行数几乎和在infitity语句中键入丑陋的If-else一样多。

你可以这样做:

    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;
}
虽然声明一周中的几天可能是个好主意,这样您就不必每次调用该方法时都声明它们

另一方面,类似这样的情况:

    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;
}
private static int getDayOfWeek(最终字符串日){
断言日期!=null;
最终字符串[]天={“星期日”、“星期一”、“星期二”、“星期三”、“星期四”、“星期五”、“星期六”};
对于(int i=0;i
为什么不一次性初始化所需内容

private static final Map<String, Integer> weekDays;
static
{
    weekDays= new HashMap<String, Integer>();
    weekDays.put("Monday", Calendar.MONDAY);
    weekDays.put("Tuesday", Calendar.TUESDAY);
    // etc
}
私人静态最终地图工作日;
静止的
{
weekDays=新HashMap();
工作日。放置(“星期一”,日历。星期一);
工作日。放置(“星期二”,日历。星期二);
//等
}

您可以使用
SimpleDateFormat
它还可以解析特定
地区的日期

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);
    }

}
为什么不声明地图:

Map<String, Integer> daysMap = new HashMap<String, Integer>();

daysMap.add("monday", 0);
daysMap.add("tuesday", 1);
//etc.

这应该可以满足你的需要。您甚至可以从一些文件/数据库等加载数据。

考虑使用以下辅助方法

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;
    }
}

请注意,只有Java 7以后的版本才支持使用带有
开关大小写的字符串。

我通常使用枚举,不过在这种情况下,输入必须是正确的大小写

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

有关非英语工作日的名称,请参见

tl;博士 java.time 如果一周中的某一天的名称恰好是英文的完整名称(星期一、星期二等),那么这恰好与枚举中定义的枚举对象的名称一致

将您的输入转换为所有大写字母,并解析以获取一周中该天的常量对象

String input = "Monday" ;
String inputUppercase = input.toUppercase() ;  // MONDAY
DayOfWeek dow = DayOfWeek.valueOf( inputUppercase );  // Object, neither a string nor a number.
现在我们有了一个完整的功能对象,而不是字符串,请输入星期一为1,星期日为7的整数(标准定义)

使用
DayOfWeek
对象而不是字符串 我敦促你尽量减少使用一周中某一天的名称或数字。只要有可能,使用对象

顺便说一下,您可以自动本地化星期天名称

String output = DayOfWeek.MONDAY.getDisplayName( TextStyle.FULL , Locale.CANADA_FRENCH );
这种本地化只能通过
DayOfWeek
类实现。要使用英语以外的其他语言转到其他方向,请参阅


关于java.time 该框架内置于Java8及更高版本中。这些类取代了麻烦的旧日期时间类,例如,&

该项目现已启动,建议迁移到类

要了解更多信息,请参阅。并搜索堆栈溢出以获得许多示例和解释。规格是

从哪里获得java.time类

  • 后来
    • 内置的
    • 标准JavaAPI的一部分,带有捆绑实现
    • Java9添加了一些次要功能和修复
    • 大部分java.time功能都在中向后移植到Java6和Java7
    • 该项目专门为Android采用了ThreeTen Backport(如上所述)

该项目使用其他类扩展了java.time。这个项目是java.time将来可能添加的一个试验场。如果您使用的是java 8,您可以在这里找到一些有用的类,如、、和。

import java.time.DayOfWeek;
然后只需使用:DayOfWeek.[DAY].getValue()

对于旧版本,请检查以下答案:

使用
DateFormatSymbols
类中内置的名称,如下所示。星期天返回0,星期六返回6,任何无效日期返回-2。添加您自己认为合适的错误处理

private static final List dayNames = Arrays.asList(new DateFormatSymbols().getWeekdays());

public int dayNameToInteger(String dayName) {
    return dayNames.indexOf(dayName) - 1;
}

提示:与其在一周中的某一天传递这些字符串,不如传递在该枚举中预定义的对象。我想我需要用另一种方式来传递:-)字符串到intFYI,像、
java.text.SimpleTextFormat
这样麻烦的旧日期时间类现在,被类取代了。我不相信这是编译的。如果您修复了它,它将实际上与Tala的答案相同。按照标准,周一至周日运行1-7次。
System.out.println(DayOfWeek.MONDAY.getValue());
System.out.println(DayOfWeek.TUESDAY);
System.out.println(DayOfWeek.FRIDAY.getValue());
private static final List dayNames = Arrays.asList(new DateFormatSymbols().getWeekdays());

public int dayNameToInteger(String dayName) {
    return dayNames.indexOf(dayName) - 1;
}