我需要将当前季度的第一个日期作为java.util.Date对象,将当前季度的最后一个日期作为java.util.Date对象。
我正在使用以下方法来获得这个月的第一次约会和这个月的最后一次约会。
private Date getThisMonthFirstDate(){
Calendar calendar = new GregorianCalendar();
calendar.set(Calendar.HOUR_OF_DAY, 0);
calendar.set(Calendar.MINUTE, 0);
calendar.set(Calendar.SECOND, 0);
calendar.set(Calendar.MILLISECOND, 0);
calendar.set(Calendar.DAY_OF_MONTH, 1);
return calendar.getTime();
}
private Date getThisMonthLastDate(){
Calendar calandar = new GregorianCalendar();
calendar.set(Calendar.HOUR_OF_DAY, 0);
calendar.set(Calendar.MINUTE, 0);
calendar.set(Calendar.SECOND, 0);
calendar.set(Calendar.MILLISECOND, 0);
calendar.set(Calendar.DAY_OF_MONTH,1);
calendar.add(Calendar.MONTH, 1);
calendar.add(Calendar.DATE, -1);
return calendar.getTime();
}是否有办法修改这个功能来实现这一点,或者有人能指出一个更好的方法吗?
假设Q1 =一月二月三月,Q2 =四月,五月,六月等。
发布于 2016-04-08 07:54:47
以下是Java 7或更高版本的解决方案(否则,我建议检查其他答案):
private static Date getFirstDayOfQuarter(Date date) {
Calendar cal = Calendar.getInstance();
cal.setTime(date);
cal.set(Calendar.DAY_OF_MONTH, 1);
cal.set(Calendar.MONTH, cal.get(Calendar.MONTH)/3 * 3);
return cal.getTime();
}
private static Date getLastDayOfQuarter(Date date) {
Calendar cal = Calendar.getInstance();
cal.setTime(date);
cal.set(Calendar.DAY_OF_MONTH, 1);
cal.set(Calendar.MONTH, cal.get(Calendar.MONTH)/3 * 3 + 2);
cal.set(Calendar.DAY_OF_MONTH, cal.getActualMaximum(Calendar.DAY_OF_MONTH));
return cal.getTime();
}注1:月在java.util.Calendar中表示为从0(1月)到11 (12月)的整数
注释2: Java中整数的除法会产生地板值(另一个整数值)。2/3 = 0,4/3 =1,以此类推。因此,cal.get(Calendar.MONTH)/3 * 3计算的零基指数为: 0(Q1),1(Q2),2(Q3),3(Q4).
例句:日历中的2月为1.so,1/3*3= 0。
如果提供2月日期,则季度开始日期为1月1日(因为我们得到0),季度末为0+2=2 (Mar)。
发布于 2018-06-05 14:42:29
纯Java-8+解决方案:
LocalDate localDate = LocalDate.now();
LocalDate firstDayOfQuarter = localDate.with(localDate.getMonth().firstMonthOfQuarter())
.with(TemporalAdjusters.firstDayOfMonth());
LocalDate lastDayOfQuarter = firstDayOfQuarter.plusMonths(2)
.with(TemporalAdjusters.lastDayOfMonth());发布于 2016-04-08 19:05:48
正如其他人提到的,您正在使用过时的类。Sun/Oracle决定用java.time框架取代旧的日期时间类,这是一个巨大的改进。
避免使用旧的日期-时间类。它们确实设计得很糟糕,令人困惑,也很麻烦。
java.time
java.time框架内置在Java8中,对于Java6& 7,使用后台端口三次-支持。对于Android来说,它是对后端端口ThreeTenABP的改造。
java.time框架的灵感来源于由JSR 310定义的高度成功的Joda-Time库,并由ThreeTen额外项目扩展。见Oracle教程。
LocalDate
对于只有日期的值,没有一天的时间,也没有时区,使用LocalDate内置作为java.time的一部分。要获得当前的日期,需要一个时区,因为日期在世界各地都有变化(东方新的一天会提前到来)。
ZoneId zoneId = ZoneId.of ( "America/Montreal" );
LocalDate today = LocalDate.now ( zoneId );Quarter & YearQuarter
上面提到的三次-额外项目是将来可能添加到java.time中的特性的试验场。要使用这个库,请将其jar文件添加到您的项目中(或使用Maven等)。如果您真的不想添加库,请参阅备选解决方案dheeran回答。
这个库目前包括您可能认为特别有用的Quarter和YearQuarter类。在代码中传递这些类型的对象比使用字符串和数字来表示季度更安全。
YearQuarter currentQuarter = YearQuarter.now ( zoneId );YearQuarter有许多有用的方法,包括询问日期。
LocalDate start = currentQuarter.atDay ( 1 );
LocalDate stop = currentQuarter.atEndOfQuarter ();转储到控制台。
System.out.println ( "today: " + today + " currentQuarter: " + currentQuarter + " start: " + start + " stop: " + stop );今日: 2016-04-08 currentQuarter: 2016-Q2开始: 2016-04-01停: 2016-06-30
如果您真的不想像我建议的那样添加ThreeTen额外的库,请参阅帕维尔的回答以获得另一种解决方案,只使用内置的java.time类。但是,如果你做了大量的工作,我相信你会发现三倍-额外的是值得的麻烦,增加一个库到您的项目。
转换
如果必须使用java.util.Date来处理尚未更新为java.time的旧代码,则可以来回转换。查找添加到旧类中的新方法以进行转换。
不幸的是,旧类缺乏任何表示日期唯一值的干净方法。因此,没有完全干净的方式可以到达/离开LocalDate。
java.sql.Date
java.sql.Date类假装是仅限日期的,但实际上包含一个经过00:00:00.0调整的时间。这个类笨拙地继承自java.util.Date,但文档显然警告不要使用这个事实;您应该将这两个类视为独立的无关类。
java.sql.Date sqlDate_quarterStart = java.sql.Date.valueOf( start );java.util.Date
java.util.Date既代表一天的日期,又代表一天的时间,在世界协调时是有效的.我们可以首先将LocalDate调整为一天中的第一分钟,以得到一天中有时间的日期,即ZonedDateTime。从那里,我们可以要求一个Instant,这是时间线上的一个时刻,在世界协调时。旧的.Date类有一个静态from( Instant )转换方法。
ZonedDateTime zdt = start.atStartOfDay( zoneId ); // First moment of the day on a certain date.
Instant instant = zdt.toInstant(); // Moment on the timeline in UTC.
java.util.Date utilDate = java.util.Date.from( instant );关于java.time
http://docs.oracle.com/javase/10/docs/api/java/time/package-summary.html框架内置到Java8和更高版本中。这些类取代了麻烦的旧遗赠日期时间类,如java.util.Date、Calendar和SimpleDateFormat。
http://www.joda.org/joda-time/项目现在在维护模式中,建议迁移到java.time类。
要了解更多信息,请参见http://docs.oracle.com/javase/tutorial/datetime/TOC.html。并搜索堆栈溢出以获得许多示例和解释。规范是JSR 310。
您可以直接与数据库交换java.time对象。使用与JDBC 4.2或更高版本兼容的JDBC 4.2。不需要字符串,也不需要java.sql.*类。
在哪里获得java.time类?
三次-额外项目使用其他类扩展java.time。这个项目是将来可能加入java.time的试验场。您可以在这里找到一些有用的类,如Interval、YearWeek、YearQuarter和更多。
https://stackoverflow.com/questions/36493649
复制相似问题