我想在选定的月份获得第一天的一周。主要条件是仅使用java.time。我需要这样的smth:
DayOfWeek dayOfWeek = LocalDate.now().with(TemporalAdjusters.firstDayOfMonth()).getDayOfWeek();
我已经拥有了YearMonth,这是我输入年份和月份的数字。我怎样才能获得每月第一天的dayOfWeek?我是这样做的:
DayOfWeek dayOfWeek = yearMonth.atDay(1).getDayOfWeek();
但是我得到了一个评论,我有"魔术数字"我需要通过正确使用库java.time消除。
答案 0 :(得分:1)
我得到了一个评论,我有"魔术数字"我需要通过正确使用库java.time来消除。
不,你没有使用magic number;评论不正确。在看到硬编码的文字数作为参数传递时,该评论的作者跳得太快了。实际上,将一个字面数作为一个参数传递是可疑的“神奇数字”,并且值得再次看,但在这种情况下是非常合适的。
术语magic number指的是数字的使用,其目的/意义/作用不是立即显而易见的。将1
传递给YearMonth.atDay()
非常明显,这意味着本月的第一天。
我个人做希望YearMonth
班级提供atFirstOfMonth
,就像atEndOfMonth
一样。我的动机是避免这个问题:敏感地发现作为参数传递的硬编码文字数字。但没什么大不了的。 您的代码对atDay( 1 )
的来电是正确而明确的。使用TemporalAdjuster
也是正确的,但不是那么明显。
单行,如果您喜欢短代码(我没有):
YearMonth.of( year , month ).atDay( 1 ).getDayOfWeek()
接下来是一些讨论来阐明这个话题。
YearMonth
我已经拥有了YearMonth,这是我输入年份和月份的数字。
Java为此提供了一个类,代表整个月:YearMonth
。
YearMonth ym = YearMonth.now() ; // Capture the current year-month as seen through the wall-clock time used by the people of the JVM’s current default time zone.
我建议在你的代码库周围传递这个类的对象,而不是仅仅使用年份和时间的整数。月。使用对象可提供类型安全性,确保有效值,并使您的代码更具自我文档。
最好指定时区。对于任何给定的时刻,日期在全球范围内因地区而异。最好明确指定期望/预期的时区,而不是隐式依赖JVM的当前默认值,该默认值可以在运行时期间随时更改。
以continent/region
的格式指定proper time zone name,例如America/Montreal
,Africa/Casablanca
或Pacific/Auckland
。切勿使用诸如EST
或IST
之类的3-4字母缩写,因为它们不是真正的时区,不是标准化的,甚至不是唯一的(!)。
ZoneId z = ZoneId.of( "America/Montreal" ) ; // Specify desired/expected time zone. Or explicitly ask for JVM’s current default: `ZoneId.systemDefault()`.
YearMonth ym = YearMonth.now( z ) ; // Capture the current year-month as seen through the wall-clock time used by the people of a particular region (time zone).
LocalDate
以LocalDate
为单位获取每月第一天的日期。
LocalDate ld = ym.atDay( 1 ) ; // Get the first day of the month.
DayOfWeek
DayOfWeek
枚举提供了七个预先存在的对象,每周一天。这些不是仅仅是字符串,而是智能对象。
DayOfWeek dow = ld.getDayOfWeek() ;
String output = dow.getDisplayName( TextStyle.FULL , Locale.CANADA_FRENCH ) ; // Generate a String representing the name of this day-of-week localized to the human language and cultural norms of a particular `Locale`.
答案 1 :(得分:0)
如果你有月份和年份而你只需要一个月的第一天,我会做这样的事情:
DayOfWeek firstDay = LocalDate.of(year, month, 1).getDayOfWeek();
基本上,您构建了dayOfMonth
param为1的日期。
根据您在一个月的第一天的解决方案,假设yearMonth
是LocalDate
这应该有效:
DayOfWeek dayOfWeek =yearMonth.with(TemporalAdjusters.firstDayOfMonth()).getDayOfWeek();
System.out.println(dayOfWeek);
答案 2 :(得分:0)
这是一个只传递LocalDate对象的解决方案:
public static String getFirstWeekDay(LocalDate date) {
int day = 1;
int month = date.getMonthValue();
int year = date.getYear();
LocalDate newDate = LocalDate.of(year, month, day);
String dayOfWeek = newDate.getDayOfWeek().toString();
return dayOfWeek;
}
或者,您可以使用以下方法获取DayOfWeek Enum:
public static DayOfWeek getFirstWeekDay(LocalDate date){
int day = 1;
int month = date.getMonthValue();
int year = date.getYear();
LocalDate newDate = LocalDate.of(year, month, day);
return newDate.getDayOfWeek();
}
我希望这会有所帮助。