使用Calendar类获取Java中特定日期的星期几字符串
我想用Java做这个简单的事情。正确答案应该是“星期三”。这有什么问题?我从Calendar类的文档中获取了这个示例使用Calendar类获取Java中特定日期的星期几字符串,java,calendar,Java,Calendar,我想用Java做这个简单的事情。正确答案应该是“星期三”。这有什么问题?我从Calendar类的文档中获取了这个示例 import java.util.*; import java.lang.Integer; class Dumb { public static List<String> dows = Collections.unmodifiableList(Arrays.asList("SUNDAY","MONDAY","TUESDAY","WEDNESDAY","THURS
import java.util.*;
import java.lang.Integer;
class Dumb {
public static List<String> dows = Collections.unmodifiableList(Arrays.asList("SUNDAY","MONDAY","TUESDAY","WEDNESDAY","THURSDAY","FRIDAY","SATURDAY"));
public static String getDay(String day, String month, String year) {
// get the supported ids for GMT-08:00 (Pacific Standard Time)
String[] ids = TimeZone.getAvailableIDs(-8 * 60 * 60 * 1000);
// if no ids were returned, something is wrong. get out.
if (ids.length == 0)
System.exit(0);
// create a Pacific Standard Time time zone
SimpleTimeZone pdt = new SimpleTimeZone(-8 * 60 * 60 * 1000, ids[0]);
// set up rules for Daylight Saving Time
pdt.setStartRule(Calendar.APRIL, 1, Calendar.SUNDAY, 2 * 60 * 60 * 1000);
pdt.setEndRule(Calendar.OCTOBER, -1, Calendar.SUNDAY, 2 * 60 * 60 * 1000);
// create a GregorianCalendar with the Pacific Daylight time zone
// and the desired date and time
Calendar calendar = new GregorianCalendar(pdt);
calendar.set(Calendar.MONTH, Integer.valueOf(month));
calendar.set(Calendar.DAY_OF_MONTH, Integer.valueOf(day));
calendar.set(Calendar.YEAR, Integer.valueOf(year));
// print out a bunch of interesting things
System.out.println("SUNDAY: " + calendar.SUNDAY);
System.out.println("MONDAY: " + calendar.MONDAY);
System.out.println("TUESDAY: " + calendar.TUESDAY);
System.out.println("WEDNESDAY: " + calendar.WEDNESDAY);
System.out.println("THURSDAY: " + calendar.THURSDAY);
System.out.println("FRIDAY: " + calendar.FRIDAY);
System.out.println("SATURDAY: " + calendar.SATURDAY);
System.out.println("YEAR: " + calendar.get(Calendar.YEAR));
System.out.println("MONTH: " + calendar.get(Calendar.MONTH));
System.out.println("DATE: " + calendar.get(Calendar.DATE));
System.out.println("DAY_OF_WEEK: " + calendar.get(Calendar.DAY_OF_WEEK));
int dow = calendar.get(Calendar.DAY_OF_WEEK);
return dows.get(dow-1);
}
}
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
String month = in.next();
String day = in.next();
String year = in.next();
System.out.println(getDay(day, month, year));
}
因为这个月是以零为基础的 我应该从这个月减去1
argh因为月份是以零为基础的 我应该从这个月减去1
arghJava日期时间问题已在java8 DateTime中修复。 使用下面的代码。你的问题会解决的
public static String getDay(String day, String month, String year) {
return LocalDate.parse(day+"-"+month+"-"+year , DateTimeFormatter.ofPattern( "dd-MM-yyyy" ))
.getDayOfWeek()
.getDisplayName(TextStyle.FULL_STANDALONE , Locale.ENGLISH);
}
Java日期时间问题已在java8 DateTime中修复。 使用下面的代码。你的问题会解决的
public static String getDay(String day, String month, String year) {
return LocalDate.parse(day+"-"+month+"-"+year , DateTimeFormatter.ofPattern( "dd-MM-yyyy" ))
.getDayOfWeek()
.getDisplayName(TextStyle.FULL_STANDALONE , Locale.ENGLISH);
}
看一看
试试这个:
Scanner in = new Scanner(System.in);
String month = in.next();
String day = in.next();
String year = in.next();
LocalDate ld = LocalDate.of(Integer.parseInt(year), Integer.parseInt(month), Integer.parseInt(day));
System.out.println(ld.getDayOfWeek());
软件包中有很多不错的课程。看看并
试试这个:
Scanner in = new Scanner(System.in);
String month = in.next();
String day = in.next();
String year = in.next();
LocalDate ld = LocalDate.of(Integer.parseInt(year), Integer.parseInt(month), Integer.parseInt(day));
System.out.println(ld.getDayOfWeek());
软件包中有很好的类。编辑:基于Ole V.V.的最新评论。程序中没有错误。只是在我的工作站上重新尝试了一下,这是因为月份编号方案是基于0的,而不是slashdottir突出显示的1
我认为程序中可能有逻辑错误
// create a GregorianCalendar with the Pacific Daylight time zone
// and the desired date and time
Calendar calendar = new GregorianCalendar(pdt);
calendar.set(Calendar.MONTH, Integer.valueOf(month));
calendar.set(Calendar.DAY_OF_MONTH, Integer.valueOf(day));
calendar.set(Calendar.YEAR, Integer.valueOf(year));
在这部分代码中,未设置周中的天或月中的周中的天,但
在方法的末尾,我们仍在尝试检索它:
System.out.println("DAY_OF_WEEK: " + calendar.get(Calendar.DAY_OF_WEEK));
int dow = calendar.get(Calendar.DAY_OF_WEEK);
return dows.get(dow-1);
因此,您基本上得到了一周中的第天的默认值,即7,也是道琼斯指数变量的值,因此道琼斯指数-1将始终为6,而dows.get6将始终在周六返回
尝试用Calendar类设置一个月中的一周中的一天可能会很棘手。最好使用Ruben DG和sajib建议的java.time包中的功能。编辑:基于Ole V.V.的最新评论。程序中没有错误。只是在我的工作站上重新尝试了一下,这是因为月份编号方案是基于0的,而不是slashdottir突出显示的1
我认为程序中可能有逻辑错误
// create a GregorianCalendar with the Pacific Daylight time zone
// and the desired date and time
Calendar calendar = new GregorianCalendar(pdt);
calendar.set(Calendar.MONTH, Integer.valueOf(month));
calendar.set(Calendar.DAY_OF_MONTH, Integer.valueOf(day));
calendar.set(Calendar.YEAR, Integer.valueOf(year));
在这部分代码中,未设置周中的天或月中的周中的天,但
在方法的末尾,我们仍在尝试检索它:
System.out.println("DAY_OF_WEEK: " + calendar.get(Calendar.DAY_OF_WEEK));
int dow = calendar.get(Calendar.DAY_OF_WEEK);
return dows.get(dow-1);
因此,您基本上得到了一周中的第天的默认值,即7,也是道琼斯指数变量的值,因此道琼斯指数-1将始终为6,而dows.get6将始终在周六返回
尝试用Calendar类设置一个月中的一周中的一天可能会很棘手。最好使用Ruben DG和sajib建议的java.time包中的功能。tl;博士
将星期几作为特定日期的字符串获取
你工作太辛苦了。
您使用了错误的类。
我们可以将您的代码缩减为一行:
LocalDate.of( // A date-only value, without time-of-day, without time zone.
Integer.valueOf( "2018" ) , // Sane numbering. Ex: number `2018` is year 2018.
Integer.valueOf( "1" ) , // Sane numbering. Months 1-12 are January-December.
Integer.valueOf( "23" )
) // Returns a `LocalDate` object.
.getDayOfWeek() // Returns a `DayOfWeek` enum object.
.getDisplayName( // Calls a method on the enum object to automatically localize the name of the day-of-week.
TextStyle.FULL , // Specify how long or abbreviated.
Locale.US // Locale determines the human language and cultural norms used in localization.
)
看这个
星期二
我建议在处理此类代码之前先搜索堆栈溢出。这个话题已经被问过很多次了
java.time
您正在使用非常麻烦的类,这些类在几年前被java.time类取代。永远不要再碰那些遗留类
将输入字符串解析为仅限日期的值,不带时间和时区。这将是一个LocalDate对象
使用方便的枚举获取星期几。这个类预先定义了七个对象,一周中的每一天一个。您还可以在该类上找到一些方便的方法,例如下面使用的本地化功能
Java有一个非常强大和灵活的枚举工具。如果不熟悉,请学习
生成一个包含星期几名称的字符串。不需要硬编码英语。让java.time为您自动本地化
要本地化,请指定:
确定字符串的长度或缩写。
确定:
翻译日名、月名等的人类语言。
决定缩写、大写、标点、分隔符等问题的文化规范。
例如:
Locale l = Locale.CANADA_FRENCH ; // Or, Locale.UK, Locale.US, etc.
String output = dow.getDisplayName( TextStyle.FULL , l ) ;
关于java.time
该框架内置于Java8及更高版本中。这些类取代了麻烦的旧日期时间类,例如,&
该项目现已启动,建议迁移到类
要了解更多信息,请参阅。并搜索堆栈溢出以获得许多示例和解释。规格是
您可以直接与数据库交换java.time对象。使用兼容的或更高版本。不需要字符串,也不需要java.sql.*类
从哪里获得java.time类
然后
内置的。
标准JavaAPI的一部分,带有捆绑实现。
Java9添加了一些次要功能和修复。
和
大部分java.time功能都在中向后移植到Java6和Java7。
更高版本的Android捆绑包实现了java.time类。
对于早期的Android tl;博士
将星期几作为特定日期的字符串获取
你工作太辛苦了。
您使用了错误的类。
我们可以将您的代码缩减为一行:
LocalDate.of( // A date-only value, without time-of-day, without time zone.
Integer.valueOf( "2018" ) , // Sane numbering. Ex: number `2018` is year 2018.
Integer.valueOf( "1" ) , // Sane numbering. Months 1-12 are January-December.
Integer.valueOf( "23" )
) // Returns a `LocalDate` object.
.getDayOfWeek() // Returns a `DayOfWeek` enum object.
.getDisplayName( // Calls a method on the enum object to automatically localize the name of the day-of-week.
TextStyle.FULL , // Specify how long or abbreviated.
Locale.US // Locale determines the human language and cultural norms used in localization.
)
看这个
星期二
我建议在处理此类代码之前先搜索堆栈溢出。这个topi
c已经被问过很多次了
java.time
您正在使用非常麻烦的类,这些类在几年前被java.time类取代。永远不要再碰那些遗留类
将输入字符串解析为仅限日期的值,不带时间和时区。这将是一个LocalDate对象
使用方便的枚举获取星期几。这个类预先定义了七个对象,一周中的每一天一个。您还可以在该类上找到一些方便的方法,例如下面使用的本地化功能
Java有一个非常强大和灵活的枚举工具。如果不熟悉,请学习
生成一个包含星期几名称的字符串。不需要硬编码英语。让java.time为您自动本地化
要本地化,请指定:
确定字符串的长度或缩写。
确定:
翻译日名、月名等的人类语言。
决定缩写、大写、标点、分隔符等问题的文化规范。
例如:
Locale l = Locale.CANADA_FRENCH ; // Or, Locale.UK, Locale.US, etc.
String output = dow.getDisplayName( TextStyle.FULL , l ) ;
关于java.time
该框架内置于Java8及更高版本中。这些类取代了麻烦的旧日期时间类,例如,&
该项目现已启动,建议迁移到类
要了解更多信息,请参阅。并搜索堆栈溢出以获得许多示例和解释。规格是
您可以直接与数据库交换java.time对象。使用兼容的或更高版本。不需要字符串,也不需要java.sql.*类
从哪里获得java.time类
然后
内置的。
标准JavaAPI的一部分,带有捆绑实现。
Java9添加了一些次要功能和修复。
和
大部分java.time功能都在中向后移植到Java6和Java7。
更高版本的Android捆绑包实现了java.time类。
对于早期的Android仅供参考,非常麻烦的旧日期时间类,例如,和java.text.simpleDataFormat,现在被内置到java 8和更高版本中的类所取代。请参见.FYI,非常麻烦的旧日期时间类,如,和java.text.simpleDataFormat,现在被java 8和更高版本中内置的类所取代。看,你不能因为一个写得不好的库而谴责整个平台。事实上,几十年来,整个信息技术都忽略了日期-时间处理这一重要主题。第一次认真尝试开发一个强大而复杂的日期时间库是,它碰巧是用Java编写的,主要由Stephen Colebourne编写。他继续从中学习,制定了行业领先的日期-时间框架。你会发现java.time与…java捆绑在一起。你不能因为一个写得不好的库而谴责整个平台。事实上,几十年来,整个信息技术都忽略了日期-时间处理这一重要主题。第一次认真尝试开发一个强大而复杂的日期时间库是,它碰巧是用Java编写的,主要由Stephen Colebourne编写。他继续从中学习,制定了行业领先的日期-时间框架。您会发现java.time与…java捆绑在一起。@BasilBourque-同意。我只是试图在我的工作站上重现这个错误,并用我观察到的内容进行了回应,同时强调了社区其他成员的回应:很好。我收回我的评论。我建议现在添加一个关于这些类是遗留类的说明。谢谢您的建议:从下一次开始,我将强调包括这些观点。但是,在本例中,我不认为我需要添加任何内容,因为您的回答非常全面,并提供了解决方案以及背景细节:有缺陷的答案。日历将从月份、月份和年份中计算周中的天和月中的周中的天。不过,我同意使用日历可能很棘手,而且最好使用java.time.@OleV.V.-谢谢你指出这一点。当我查看文档时,我只是假设这是一个我们需要显式设置但不是真正设置的属性。我已根据您的回答编辑了我的答案:@巴塞尔堡-同意。我只是试图在我的工作站上重现这个错误,并用我观察到的内容进行了回应,同时强调了社区其他成员的回应:很好。我收回我的评论。我建议现在添加一个关于这些类是遗留类的说明。谢谢您的建议:从下一次开始,我将强调包括这些观点。但是,在本例中,我不认为我需要添加任何内容,因为您的回答非常全面,并提供了解决方案以及背景细节:有缺陷的答案。日历将从月份、月份和年份中计算周中的天和月中的周中的天。不过,我同意使用日历可能很棘手,而且最好使用java.time.@OleV.V.-谢谢你指出这一点。当我查看文档时,我只是假设 这是一个我们需要显式设置的属性,但不是真的。我已根据您的回答编辑了我的答案: