当前位置: 首页 > 知识库问答 >
问题:

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

姜胤
2023-03-14

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

共有3个答案

阎丰羽
2023-03-14

要获取表示一周中某一天(周一至周日为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.

Oleksandr的答案可能是正确的,并且使用现代java会赢得分数。时间类,而不是传统的日期时间类。但对这类代码有一种更简单的理解。此外,这个问题似乎想更进一步,以获得一个月的第一个星期几。

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

ZonedDateTime zdt = myGregCal.toZonedDateTime() ;  // Convert from legacy class to modern class.

从那里提取一个LocalDate对象。LocalDate类表示一个仅限日期的值,没有一天中的时间和时区。

LocalDate ld = zdt.toLocalDate() ;

将值调整到同月的第一天。使用在TemporalAdouners类中找到的TemporalAdouner实现。

LocalDate firstOfMonth = ld.with( TemporalAdjusters.firstDayOfMonth() ) ;

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

DayOfWeek dow = firstOfMonth.getDayOfWeek() ;

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

但如果您坚持,您可以根据ISO 8601标准提取周一至周日的int1-7。

int dowNumber = dow.getValue() ;

爪哇。时间框架内置于Java8及更高版本中。这些类取代了麻烦的旧遗留日期时间类,比如java。util。日期日历公历

现在处于维护模式的Joda-Time项目建议迁移到java.time类。

要了解更多信息,请参阅Oracle教程。并搜索Stack Overflow以获取许多示例和解释。规范是JSR 310。

在哪里可以获得java。时间课?

  • JavaSE 8、JavaSE 9及更高版本
    • 内置。
    • 标准JavaAPI的一部分,带有捆绑实现。
    • Java9增加了一些小功能和修复。
    • 许多java.time功能被反向移植到Java6
    • 更高版本的Android捆绑包实现了java。时间课

    额外的Three Ten项目扩展了java。有额外课程的时间。这个项目是java未来可能增加的一个试验场。时间你可以在这里找到一些有用的类,比如IntervalYearWeekYearQuarter,等等。

申黎明
2023-03-14

简单地说,不。这是得到这样东西的正确方法

这实际上就是他们在Java中提供的功能,使这样的计算成为可能。任何类型的“直接功能”都会在内部完成(我建议您这样做)

邓阳嘉
2023-03-14

您可以将GregorianCalendar对象转换为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());
 类似资料:
  • 所以我需要制作一个基本日历,显示特定年份和月份的日历(用户应该能够根据文本输入选择任何月份和任何年份)。 到目前为止,我已经成功地创建了一个日历obj,使用扫描仪从用户那里获取所需的月份和年份,但我的问题是,我如何找出一个月的第一天是什么?在上面的例子中,今天是星期六。我构建它的逻辑是,如果我知道第一天,我可以创建一个字符串[][]数组,通过循环从第一天开始的月份,开始显示相关日期的日期。我用扫描

  • log4j2是否提供任何机制来每天滚动文件,并在月末归档日志文件?我可以实现每日滚动,但一个月后,我想压缩所有日志并移动到存档文件夹

  • 问题内容: 我只是熟悉Apache JackRabbit。我已经完成了一些用于文档管理的多用户存储库。 如果有人同时使用它们,您能回答这些问题吗? ModeShape是否以某种方式链接到JBoss?我对JBoss AS或任何其他JBoss工具没有太多经验。我看到了对tomcat的支持,但是有很多JBossy的东西 文档说将来的发行版应该具有UI集成,这还有很长的路要走吗?它将是什么样的UI集成?是

  • 问题内容: 我正在设法迅速获得每月的第一天和最后一天。 到目前为止,我有以下内容: 但是我不确定如何获得最后的约会。我是否缺少内置方法?显然,它必须考虑leap年等。 问题答案: 您只需使用以下命令即可获得每月的第一天 要获得该月的最后一天,请添加一个月并减去一天: 或者,使用为您提供开始时间和月份长度的方法: 对于月份的最后一天的日期,请加上月份的长度减去一秒: 为Swift5更新:

  • 问题内容: 亲爱的专业人员, 我有一个查询来获取本月的第一天和最后一天,但是我对本月第一天的时间戳有疑问。 自2015年2月起,我希望获得以下结果: @LastDOM是正确的,但是我没有得到@FirstDOM的时间戳部分的零,我得到了正确的日期,但是是运行脚本的时间。假设是上午8:50,我得到: 修复此小故障的最佳方法是什么? 问候, 缺口 问题答案: 将@FirstDOM转换为如下形式: 我希望

  • 问题内容: 我需要在SQL Server 2012环境中基于2个参数创建临时表或公用表表达式 因此,如果 和 我想从当前年份生成5年的临时表,其中包含4列,例如 是否可以有效地执行“做而做”循环?我该如何计算月份名称?我正在使用一个非常麻烦的Do While循环对一年中的所有月份进行迭代,然后对所有年份进行迭代。 问题答案: 使用递归CTE的一种方法: 或使用数字表:(在这种情况下为master.