Java 是否有提供每月第一天的功能?

Java 是否有提供每月第一天的功能?,java,dayofweek,date,dayofmonth,Java,Dayofweek,Date,Dayofmonth,在Java中,我可以通过以下方式获得每月的第一天: GregorianCalendar date; // Some code int first = new GregorianCalendar(date.get(Calendar.YEAR), date.get(Calendar.MONTH), 1).get(Calendar.DAY_OF_WEEK); 我想知道是否有一个函数可以直接做到这一点,因为我找不到一个函数来获取这些重要信息 类似于我在这里尝试做的事情: fo

在Java中,我可以通过以下方式获得每月的第一天:

GregorianCalendar date;
// Some code
int first = new GregorianCalendar(date.get(Calendar.YEAR),
            date.get(Calendar.MONTH), 1).get(Calendar.DAY_OF_WEEK);
我想知道是否有一个函数可以直接做到这一点,因为我找不到一个函数来获取这些重要信息

类似于我在这里尝试做的事情:

 for (int i = 1; i < days_in_month + first; i++) {
     // Some code
     if (i - first + 1 == date.get(Calendar.DAY_OF_MONTH)) {
         // Do something
     }
 }
for(int i=1;i
简单地说,不。这是获得类似产品的正确方法


这就是他们在Java中提供的使类似计算成为可能的功能。任何类型的“直接函数”都会在内部执行(我建议您执行)。

简单地说,不。这是获得类似内容的正确方法


这就是他们在Java中提供的使类似计算成为可能的功能。任何类型的“直接函数”都可以在内部执行此操作(我建议您这样做)。

您可以将
GregoriaCalendar
对象转换为
LocalDate
对象,并使用其方便的API:

LocalDate getWithFirstDayOfMonth(GregorianCalendar c) {
    LocalDate date = c.toZonedDateTime().toLocalDate();
    return date.withDayOfMonth(1);
}

GregorianCalendar calendar = GregorianCalendar.from(ZonedDateTime.now());
LocalDate first = getWithFirstDayOfMonth(calendar);
System.out.println(first.getDayOfMonth());

您可以将
gregoriacalendar
对象转换为
LocalDate
对象,并使用其方便的API:

LocalDate getWithFirstDayOfMonth(GregorianCalendar c) {
    LocalDate date = c.toZonedDateTime().toLocalDate();
    return date.withDayOfMonth(1);
}

GregorianCalendar calendar = GregorianCalendar.from(ZonedDateTime.now());
LocalDate first = getWithFirstDayOfMonth(calendar);
System.out.println(first.getDayOfMonth());
tl;博士 要获取表示一周中某一天(周一至周日为1-7)的整数,请执行以下操作:

myGregCal                                        // Avoid troublesome legacy date-time classes such as `GregorianCalendar`.
    .toZonedDateTime()                           // Convert from legacy class to modern java.time class, a `ZonedDateTime` object.
    .toLocalDate()                               // Extract a date-only object.        
    .with( TemporalAdjusters.firstDayOfMonth() ) // Adjust into first day of the same year-month.
    .getDayOfWeek()                              // Extract a `DayOfWeek` enum object for Monday, Tuesday, etc. Consider using this object directly rather than taking the next step to extract a `int` number.
    .getValue()                                  // Extract an `int` integer number, 1-7 for Monday-Sunday.
…星期一和星期天的数字为1-7

提示:最好跳过最后一步,使用
DayOfWeek
对象而不是
int

myGregCal.toZonedDateTime().toLocalDate().with( TemporalAdjusters.firstDayOfMonth() ).getDayOfWeek()  // Render a `DayOfWeek` enum object.
java.time 这可能是正确的,使用现代java.time类而不是传统的日期时间类会赢得分数。但对这类代码有一个更简单的理解。此外,这个问题似乎想更进一步,得到一个月的第一个星期几

根据Andreas的评论,您可以调用
GregorianCalendar::toZonedDateTime
,这是一种从旧的传统类
GregorianCalendar
转换到现代的
ZonedDateTime
类的简单方法。旧类获得了新方法,以便于在遗留类和现代java.time类之间进行转换

从中提取一个
LocalDate
对象。该类表示一个仅限日期的值,不包含一天中的时间和时区

LocalDate ld = zdt.toLocalDate() ;
将该值调整为当月的第一天。使用在类中找到的实现

通过枚举对象确定该月初日期的星期几。该枚举预先定义了7个对象,一周中的每一天一个:,等等

考虑使用
DayOfWeek
enum对象,而不是简单的
int
数字来表示一周中的某一天。使用对象而不是
int
原语可以使代码更加自我记录,提供类型安全性,并确保有效值

但如果您坚持,您可以根据标准提取周一至周日的
int
1-7

int dowNumber = dow.getValue() ;

关于java.time 该框架内置于Java8及更高版本中。这些类取代了麻烦的旧日期时间类,例如,
gregorianalendar
,&

该项目现已启动,建议迁移到类

要了解更多信息,请参阅。并搜索堆栈溢出以获得许多示例和解释。规格是

从哪里获得java.time类

  • ,及以后
    • 内置的
    • 标准JavaAPI的一部分,带有捆绑实现
    • Java9添加了一些次要功能和修复
    • 大部分java.time功能都在中向后移植到Java6和Java7
    • 更高版本的Android捆绑包实现了java.time类
    • 对于早期的Android,该项目采用了ThreeTen Backport(如上所述)。看
该项目使用其他类扩展了java.time。这个项目是java.time将来可能添加的一个试验场。您可以在这里找到一些有用的类,如、、和。

tl;博士 要获取表示一周中某一天(周一至周日为1-7)的整数,请执行以下操作:

myGregCal                                        // Avoid troublesome legacy date-time classes such as `GregorianCalendar`.
    .toZonedDateTime()                           // Convert from legacy class to modern java.time class, a `ZonedDateTime` object.
    .toLocalDate()                               // Extract a date-only object.        
    .with( TemporalAdjusters.firstDayOfMonth() ) // Adjust into first day of the same year-month.
    .getDayOfWeek()                              // Extract a `DayOfWeek` enum object for Monday, Tuesday, etc. Consider using this object directly rather than taking the next step to extract a `int` number.
    .getValue()                                  // Extract an `int` integer number, 1-7 for Monday-Sunday.
…星期一和星期天的数字为1-7

提示:最好跳过最后一步,使用
DayOfWeek
对象而不是
int

myGregCal.toZonedDateTime().toLocalDate().with( TemporalAdjusters.firstDayOfMonth() ).getDayOfWeek()  // Render a `DayOfWeek` enum object.
java.time 这可能是正确的,使用现代java.time类而不是传统的日期时间类会赢得分数。但对这类代码有一个更简单的理解。此外,这个问题似乎想更进一步,得到一个月的第一个星期几

根据Andreas的评论,您可以调用
GregorianCalendar::toZonedDateTime
,这是一种从旧的传统类
GregorianCalendar
转换到现代的
ZonedDateTime
类的简单方法。旧类获得了新方法,以便于在遗留类和现代java.time类之间进行转换

从中提取一个
LocalDate
对象。该类表示一个仅限日期的值,不包含一天中的时间和时区

LocalDate ld = zdt.toLocalDate() ;
将该值调整为当月的第一天。使用在类中找到的实现

通过枚举对象确定该月初日期的星期几。该枚举预先定义了7个对象,一周中的每一天一个:,等等

考虑使用
DayOfWeek
enum对象,而不是简单的
int
数字来表示一周中的某一天。使用对象而不是
int
原语可以使代码更加自我记录,提供类型安全性,并确保有效值

但如果您坚持,您可以根据标准提取周一至周日的
int
1-7

int dowNumber = dow.getValue() ;

关于java.time 该框架内置于Java8及更高版本中。这些类取代了麻烦的旧日期时间类,例如,
gregorianalendar