Java 在Joda Time中,将DateTime设置为月初
My API允许库客户端传递日期:Java 在Joda Time中,将DateTime设置为月初,java,date,jodatime,Java,Date,Jodatime,My API允许库客户端传递日期: method(java.util.Date date) 从这个日期开始,我想提取这个月,并迭代这个月包含的所有天 现在,传递的日期通常是new date()-表示当前时刻。我的问题实际上是将新的DateMidnight(jdkDate)实例设置为月初 请有人在本月第一天开始时的午夜时分演示此用例,如下所示: // first midnight in this month DateMidnight first = new DateMidnight().with
method(java.util.Date date)
从这个日期开始,我想提取这个月,并迭代这个月包含的所有天
现在,传递的日期通常是new date()-表示当前时刻。我的问题实际上是将新的DateMidnight(jdkDate)实例设置为月初
请有人在本月第一天开始时的午夜时分演示此用例,如下所示:
// first midnight in this month
DateMidnight first = new DateMidnight().withDayOfMonth(1);
// last midnight in this month
DateMidnight last = first.plusMonths(1).minusDays(1);
如果从java.util.Date开始,则使用不同的DateMidnight构造函数:
// first midnight in java.util.Date's month
DateMidnight first = new DateMidnight( date ).withDayOfMonth(1);
Joda Time java doc-哦,我不知道这是关于jodatime的。无论如何:
Calendar c=Calendar.getInstance();
c、 设定时间(日期);
c、 设置(日历小时/天,0);
c、 设置(日历分钟,0);
c、 设置(日历秒,0);
c、 设置(日历毫秒,0);
int min=c.getActualMinimum(日历日,每月);
int max=c.getActualMaximum(日历日/月);
对于(int i=min;i=max;i++){
c、 设置(日历日/月/日,i);
System.out.println(c.getTime());
}
或使用commons lang:
datemin=DateUtils.truncate(日期、日历、月份);
最大日期=DateUtils.addMonths(最小,1);
for(日期cur=min;cur.before(max);cur=DateUtils.addDays(cur,1)){
系统输出打印项次(cur);
}
获取每月第一天的另一种方法(不考虑DateMidnight)是使用:
DateTime firstDayOfMonth = new DateTime().dayOfMonth().withMinimumValue();
一天中的第一刻
答案是正确的,但没有将时间放在一天中的第一个时刻。要调整时间,请将调用附加到
/©2013巴西尔布尔克。此源代码可以由任何对此承担全部责任的人自由使用。
org.joda.time.DateTime startofthesismonth=新建org.joda.time.DateTime().dayOfMonth().withMinimumValue().withTimeAtStartOfDay();
org.joda.time.DateTime startofNextMonth=startOfThisMonth.plusMonths(1).dayOfMonth().withMinimumValue().withTimeAtStartOfDay();
System.out.println(“StartTofThisMonth:+StartTofThisMonth”);
System.out.println(“startofNextMonth:+startofNextMonth”);
当你在美国西雅图跑步时
本月开始时间:2013-11-01T00:00:00.000-07:00
下个月开始:2013-12-01T00:00:00.000-08:00
请注意这两行控制台输出中的差异:-7与-8,因为
通常,应该始终指定时区,而不是依赖默认值。为简单起见,此处省略。应该添加这样一行,并将时区对象传递给上面示例中使用的构造函数
//时区列表:http://joda-time.sourceforge.net/timezones.html (可能已过时,请阅读该页上的注释)
//UTC时区(无偏移)有一个常量,因此无需构造:org.joda.time.DateTimeZone.UTC
org.joda.time.DateTimeZone kolkataTimeZone=org.joda.time.DateTimeZone.forID(“亚洲/加尔各答”);
java.time
以上是正确的,但已经过时。Joda时间库现在被java 8及更高版本中内置的java.Time框架所取代
LocalDate
表示一个只包含日期的值,不包含一天中的时间和时区。时区对于确定日期至关重要。在任何一个特定的时刻,全球各地的日期都会因地区而异
ZoneId zoneId = ZoneId.of( "America/Montreal" );
LocalDate today = LocalDate.now( zoneId );
使用其中一个来获得月的第一天
LocalDate firstOfMonth = today.with( TemporalAdjusters.firstDayOfMonth() );
LocalDate
可以生成表示一天中第一个时刻的ZoneDateTime
ZonedDateTime firstMomentOfCurrentMonth = firstOfMonth.atStartOfDay( zoneId );
DateMidnight
现在已不推荐使用。相反,您可以:
LocalDate firstOfMonth = new LocalDate(date).withDayOfMonth(1);
LocalDate lastOfMonth = firstOfMonth.plusMonths(1).minusDays(1);
如果您知道时区,请使用新的LocalDate(日期,时区)
以提高准确性
您也可以使用.dayOfMonth().withMinimumValue()
代替。withDayOfMonth(1)
编辑:
这将为您提供
12/1/YYYY 00:00
和12/31/YYYY 00:00
。如果您希望最后一个月实际上是下一个月的第一个月(因为您正在执行一个BEVERY子句),则从最后一个月的计算中删除天数(1)
,您可以使用以下方法获得月的开始日期和结束日期:
DateTime monthStartDate = new DateTime().dayOfMonth().withMinimumValue();
DateTime monthEndDate = new DateTime().dayOfMonth().withMaximumValue();
问题标题应该提到Joda时间。它确实“有人能用Joda时间演示这个用例吗?”我添加了另一个注释,以更清楚地说明这是一个Joda时间问题。@MaximVeksler Lachlan Roche说标题应该提到Joda时间。我做了编辑。感谢JavaBasicAPI注释。顺便说一句,关于“最后”为什么不:DateMidnight last=first.plusMonths(1)minus days(1);同样的道理,只是更干净。这个答案是正确的,但现在已经过时了。并非每个时区的每一天都有午夜。Joda Time 2添加了一个方法来代替“midnight”功能。DateMidnight现在不推荐使用。来自JavaDoc:“在夏令时前移跳过午夜的某些时区中,午夜时间不存在。使用LocalDate表示没有时区的日期。或者使用DateTime表示完整的日期和时间,可能使用DateTime.withTimeAtStartOfDay()来获取一天开始的瞬间。”<代码> DateMidnight <代码>已被弃用。虽然日期将是本月的第一个月,但时间仍然是一天当中的一天。将.withTimeAtStartOfDay()添加到末尾可以解决此问题。您还可以添加.dayOfMonth().withMaximumValue().hourOfDay().withMaximumValue(),并可以将其添加到小时分钟中。。。更precise@Xylian我想这取决于对问题的解释。无论哪一天,它都会给你每月第一天的午夜和最后一天的午夜。如果您想要下个月第一天的午夜,只需从第二天删除“.minus days(1)。如果您仍然认为我的答案不正确,请详细说明,因为我的单元测试表明它是有效的。