我需要确定6个月前的日期。例如:
Feb-27, 2012(Today) - It is Feb and we don't count incomplete month, false
Feb-01, 2012 - Still Feb so don't count too, false
Jan-01, 2011 - Completed, false
Dec-01, 2011 - Completed, false
Nov-01, 2011 - Completed, false
Oct-01, 2011 - Completed, false
Sep-01, 2011 - Completed, false
Aug-01, 2011 - Completed, false
Jul-01, 2011 - Already pass 6 complete months, true
它应该在将来的任何日期工作。
我想到当前日期减去30 * 6 = 180天,但它不准确。
它必须准确,因为,例如,如果我们确定2011年7月有效,那么我们将保存该月的所有数据。
感谢。
答案 0 :(得分:19)
我会尝试这个简单的逻辑来完成这项工作。
Calendar cal = Calendar.getInstance(); //Get current date/month i.e 27 Feb, 2012
cal.add(Calendar.MONTH, -6); //Go to date, 6 months ago 27 July, 2011
cal.set(Calendar.DAY_OF_MONTH, 1); //set date, to make it 1 July, 2011
希望这有帮助。
答案 1 :(得分:7)
如果你可以使用JodaTime,这里的代码是±6个月的计算:
import org.joda.time.DateTime;
import org.joda.time.Months;
....
....
DateTime now = new DateTime();
DateTime then = new DateTime().withDate(2011, 8, 1);
if(Math.abs(Months.monthsBetween(now, then).getMonths()) > 6){
System.out.println("6 mo apart!");
//your logic goes here
}
答案 2 :(得分:2)
使用joda-time等库来满足您的时间和日期需求。我认为你可以这样做:
new LocalDate()。minusMonths(7)。withDayOfMonth(1)
(7个月来支付任何部分月份......留下了本月第一天的优势......但是......)
答案 3 :(得分:1)
YearMonth
Java内置的java.time.YearMonth
类使这项任务变得简单。
获取当前年度月份。这需要一个时区,因为在任何特定时刻,日期在全球范围内按区域变化。在该月的第一天/最后一天,该地区可能因地区而异。
YearMonth ymCurrent = YearMonth.now( ZoneId.of( "America/Montreal" ) );
根据定义,我们知道当前月份不完整。所以搬到上个月。
YearMonth ymPrevious = ymCurrent.minusMonths( 1 ) ;
如果需要,可以提前六个月再搬家。
YearMonth ymSixMonthsMore = ymPrevious.minusMonths( 6 );
YearMonth
对象本身在您的代码中可能很有用。您可以在代码中传递此类的这些对象。
如果您需要一个月的第一天,请询问。
LocalDate ld = ymSixMonthsMore.atDay( 1 );
答案 4 :(得分:0)
据我了解,您需要有一个实用程序,用于确定变量日期是否在您设置的参考日期之前6个月。看看我的代码片段来解决这个问题。只需使用java.util.Calendar
,您就不必使用其他库。
import java.util.Calendar;
public class Test
{
public static void main(String[] args)
{
Calendar cal1 = Calendar.getInstance();
cal1.set(2012, 2, 27);
Calendar cal2 = Calendar.getInstance();
cal2.set(2011, 8, 1);
boolean valid = isSixMonthsAgo(cal1, cal2);
System.out.println(valid);
}
public static boolean isSixMonthsAgo(Calendar referenceDate, Calendar dateToBeTested)
{
int year1 = referenceDate.get(Calendar.YEAR);
int month1 = referenceDate.get(Calendar.MONTH);
int year2 = dateToBeTested.get(Calendar.YEAR);
int month2 = dateToBeTested.get(Calendar.MONTH);
if ((year1 * 12 + month1) - (year2 * 12 + month2) > 6)
return true;
return false;
}
}