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)
对于任何对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)
对于非英语的星期几名称,请参阅tete 的回答。
\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如果您的星期几名称恰好是英文的全长名称(星期一、星期二等),那么它恰好与枚举中定义的枚举对象的名称一致DayOfWeek
。
将您的输入转换为全部大写,并解析以获取该星期几的常量对象。
\n\nString 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\nint dayOfWeekNumber = dow.getValue() ;\n
Run Code Online (Sandbox Code Playgroud)\n\nDayOfWeek
对象而不是字符串我强烈建议您尽量减少使用名称或星期几。相反,尽可能使用DayOfWeek
对象。
顺便说一句,您可以自动本地化星期几名称。
\n\nString output = DayOfWeek.MONDAY.getDisplayName( TextStyle.FULL , Locale.CANADA_FRENCH );\n
Run Code Online (Sandbox Code Playgroud)\n\n这种本地化只能通过DayOfWeek
课堂进行。要使用英语以外的其他语言,请参阅tete 的回答。
java.time框架内置于 Java 8 及更高版本中。这些类取代了麻烦的旧遗留日期时间类,例如java.util.Date
, Calendar
, & SimpleDateFormat
。
Joda -Time项目现在处于维护模式,建议迁移到java.time类。
\n\n要了解更多信息,请参阅Oracle 教程。并在 Stack Overflow 上搜索许多示例和解释。规格为JSR 310。
\n\n从哪里获取 java.time 类?
\n\nThreeTen -Extra项目通过附加类扩展了 java.time。该项目是 java.time 未来可能添加的内容的试验场。您可能会在这里找到一些有用的类,例如Interval
、、、等等。YearWeek
YearQuarter
你可以这样做:
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)
归档时间: |
|
查看次数: |
14098 次 |
最近记录: |