使用JodaTime获取一年中每个月的第一天和最后一天的最简单方法

时间:2014-04-01 08:46:39

标签: java android jodatime

我将Sqlite表中的日期/时间存储为Long值,因此它们最终看起来像138329292113.这个问题虽然易于存储,但是它很难排序。我正在研究一个与高图图形相关联的过滤函数,以允许用户将图形过滤到特定日期范围,因此需要能够按表格对日期,月份等的结果进行过滤和求和。 / p>

到目前为止,我想到的唯一方法就是使用以下代码行,每个月都需要重复这些代码:

LocalDate ld2 = new LocalDate();
long januaryStart = ld2.monthOfYear().withMinimumValue().dayOfMonth().withMinimumValue().toDateTimeAtStartOfDay().getMillis();
long januaryEnd = ld2.monthOfYear().withMinimumValue().dayOfMonth().withMaximumValue().toDateTimeAtMidnight().getMillis();

然后,我只需要在1月份添加一个月即可获得2月份,等等。使用此功能,我应该可以在月初和月末获得毫秒数,并将其传递给SQL语句返回基于此范围的总和。我一直在想是否每个月(或其他时间间隔)都有一种更简单的方法可以做到这一点,但到目前为止,这是我能想到的全部内容。

是否有一种更简单的方法可以解决这个问题?

提前致谢!

1 个答案:

答案 0 :(得分:2)

我觉得你尝试了一点点:

LocalDate date = new LocalDate(); // note: current date in system time zone
date = date.withMonthOfYear(1); // set to January

while (date.getMonthOfYear() < 12) {
  long monthStart = date.dayOfMonth().withMinimumValue().toDateTimeAtStartOfDay().getMillis();
  long monthEnd = date.dayOfMonth().withMaximumValue().toDateTimeAtStartOfDay().getMillis();
  // store your longs in db
  date = date.plusMonths(1);
}

我个人希望您重新考虑将结果存储为绝对长毫的决定。这种方法很难将存储的时间戳更改回普通日期。有时候不会有可逆的1:1映射。 ANSI-SQL具有DATE的列类型定义,没有时间或时区。在JDBC中,您可以使用类java.sql.Date。通常,您应该选择最适合您的域用例的数据类型。不应将毫秒级的毫秒时间戳视为通用解决方案。因此,如果您决定选择一个简单的日期,那么您的代码可以进一步简化!然后在一天开始时无需转换为DateTime(甚至是时区依赖的)。