Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/date/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 在Joda Time中,将DateTime设置为月初_Java_Date_Jodatime - Fatal编程技术网

Java 在Joda Time中,将DateTime设置为月初

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

My API允许库客户端传递日期:

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)。如果您仍然认为我的答案不正确,请详细说明,因为我的单元测试表明它是有效的。