java - 在没有固有 WithDayOfMonth 方法的情况下使用 DateTime 将日期设置为每月第一天的最佳方法

标签 java date datetime jodatime method-signature

因此,我主要尝试获取 2 个 DateTime 对象并将它们设置为各自月份的第一天,以便我最终可以计算出这两个日期之间的月份。

代码示例:

DateTime dt = new DateTime();
DateTime newDT = dt.withDayOfMonth(1);

在任何人问之前,实际代码将 Date 对象转换为 DateTime 对象,该对象在代码的另一部分中使用。

问题是,当我在单元测试中这样做时,它似乎工作得很好。但是,当我尝试使用 SOAP UI 对此进行测试时,我可以在调试过程中看到由于以下原因出现运行时异常:

method lookup failed for selector "withDayOfMonth" with signature "(I)Lorg/joda/time/DateTime;"

在相应的 server.txt 日志文件中,我可以看到堆栈跟踪,表明没有这样的方法 已经发生。

经过进一步研究,我发现我们的应用服务器目前使用的是过时版本的 JodaTime jar (1.2.1),而我的 eclipse 库包含正确的 jar (1.6.2)。

但是,现在的问题是什么是实现我的目标的最佳方法(创建一个新的 DateTime 对象,并将每月的第一天设置为 0),因为我无法访问 JodaTime 提供的 withDayOfMonth 方法?

最佳答案

tl;dr

LocalDate firstOfThisMonth = 
    LocalDate.now( ZoneId.of( "America/Montreal" ) )
             .with( TemporalAdjusters.firstDayOfMonth() ) ;

详情

其他答案可以解决您的 Joda-Time 问题。然而,Joda-Time 项目现在处于维护模式,团队建议迁移到 java.time 类。所以这是 java.time 代码中的解决方案。

本地日期

LocalDate类表示没有时间和时区的纯日期值。

时区对于确定日期至关重要。对于任何给定时刻,日期在全局范围内因地区而异。例如,午夜后几分钟 Paris France是新的一天,但在Montréal Québec 中仍然是“昨天” .

ZoneId z = ZoneId.of( "America/Montreal" );
LocalDate today = LocalDate.now( z );

时间调整器

TemporalAdjuster java.time 中的接口(interface)提供类来操作值。 TemporalAdjusters 类(注意复数 s)提供了几种方便的调整器实现。一个是 firstDayOfMonth .

LocalDate firstOfThisMonth = today.with( TemporalAdjusters.firstDayOfMonth() ) ;

firstOfThisMonth.toString(): 2016-03-01

句号

Period 类跟踪未附加到时间轴的时间跨度。它保留了若干年、月和日。

LocalDate start = LocalDate.of ( 2016 , 1 , 1 ) ;
LocalDate stop = LocalDate.of ( 2016 , 3 , 1 ) ;
Period p = Period.between ( start , stop ) ;

Period 上调用toString 生成标准的字符串ISO 8601格式。

P2M

您可以要求其中一部分作为数字,例如月数。

int months = p.getMonths();

2

请注意,此处显示的耗时明智地使用了半开方法,其中开始是包含,而结束是不包含

关于java.time

java.time框架内置于 Java 8 及更高版本中。这些类取代了麻烦的旧类 legacy日期时间类,例如 java.util.Date , .Calendar , & java.text.SimpleDateFormat .

Joda-Time项目,现在在maintenance mode , 建议迁移到 java.time。

要了解更多信息,请参阅 Oracle Tutorial .并在 Stack Overflow 中搜索许多示例和解释。规范为 JSR 310 .

从哪里获得 java.time 类?

ThreeTen-Extra项目用附加类扩展 java.time。该项目是 future 可能添加到 java.time 的试验场。您可能会在这里找到一些有用的类,例如 Interval , YearWeek , YearQuarter , 和 more .

关于java - 在没有固有 WithDayOfMonth 方法的情况下使用 DateTime 将日期设置为每月第一天的最佳方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39968100/

相关文章:

java - JVM "Reboot"的一种方法

ios - 将字符串转换为 NSDate 给出错误的日期

mysql - 从整数年、月和日期构造 java.sql.Date

cakephp - 如何在 Cakephp 中根据国家时区显示时间

c# - 如何使用 C# 将 DateTime 或 DbNull 发送到数据库?

php - MySQL查询中基于日期的第n条记录

javascript - wait.until(ExpectedConditions.elementToBeClickable) 不起作用

java - 在java中使用标签重要吗?

java - 获取一行 HBase 的特定列族中的列

datetime - 如何实际保持DateTime.now()为最新状态?