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

Fra*_*fka 8 java calendar date dayofweek simpledateformat

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

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

Ren*_*ink 10

您可以使用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);
    }

}
Run Code Online (Sandbox Code Playgroud)


tet*_*ete 6

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));
    }
}
Run Code Online (Sandbox Code Playgroud)

输出为:

TUESDAY
Run Code Online (Sandbox Code Playgroud)


Bas*_*que 6

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

\n\n

太长了;博士

\n\n
 DayOfWeek.valueOf( "Monday".toUppercase() )  // `DayOfWeek` object. Works only for English language.\n          .getValue()                         // 1\n
Run Code Online (Sandbox Code Playgroud)\n\n

java.time

\n\n

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

\n\n

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

\n\n
String input = "Monday" ;\nString inputUppercase = input.toUppercase() ;  // MONDAY\nDayOfWeek dow = DayOfWeek.valueOf( inputUppercase );  // Object, neither a string nor a number.\n
Run Code Online (Sandbox Code Playgroud)\n\n

现在我们有了一个全功能对象而不是字符串,请询问该星期几的整数,其中星期一为 1,星期日为 7(标准ISO 8601定义)。

\n\n
int dayOfWeekNumber = dow.getValue() ;\n
Run Code Online (Sandbox Code Playgroud)\n\n

使用DayOfWeek对象而不是字符串

\n\n

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

\n\n

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

\n\n
String output = DayOfWeek.MONDAY.getDisplayName( TextStyle.FULL , Locale.CANADA_FRENCH );\n
Run Code Online (Sandbox Code Playgroud)\n\n

这种本地化只能通过DayOfWeek课堂进行。要使用英语以外的其他语言,请参阅tete 的回答

\n\n
\n\n

关于 java.time

\n\n

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

\n\n

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

\n\n

要了解更多信息,请参阅Oracle 教程。并在 Stack Overflow 上搜索许多示例和解释。规格为JSR 310

\n\n

从哪里获取 java.time 类?

\n\n\n\n

ThreeTen -Extra项目通过附加类扩展了 java.time。该项目是 java.time 未来可能添加的内容的试验场。您可能会在这里找到一些有用的类,例如Interval、、、等等。YearWeekYearQuarter

\n


Jos*_*h M 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];
}
Run Code Online (Sandbox Code Playgroud)

尽管声明一周中的几天可能是一个好主意,这样您就不必在每次调用该方法时都不断声明它们。

反过来说,是这样的:

    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;
}
Run Code Online (Sandbox Code Playgroud)