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

时间:2013-08-14 12:55:32

标签: java date calendar simpledateformat dayofweek

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

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

10 个答案:

答案 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.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

答案 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

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课程,本地化才是单向的。要使用英语以外的语言转到另一个方向,请参阅Answer by tete

关于java.time

java.time框架内置于Java 8及更高版本中。这些类取代了麻烦的旧legacy日期时间类,例如java.util.DateCalendar和&amp; SimpleDateFormat

现在位于Joda-Timemaintenance mode项目建议迁移到java.time类。

要了解详情,请参阅Oracle Tutorial。并搜索Stack Overflow以获取许多示例和解释。规范是JSR 310

从哪里获取java.time类?

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

答案 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