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