今天的日期,我应该得到上个月的第一个日期和最后日期。我无法想出任何逻辑。
例如,在传递05/30/2012
时,我应该04/01/2012
和04/30/2012
。
任何帮助将不胜感激。感谢。
答案 0 :(得分:29)
Calendar cal = Calendar.getInstance();
cal.add(Calendar.MONTH, -1);
cal.set(Calendar.DATE, 1);
Date firstDateOfPreviousMonth = cal.getTime();
cal.set(Calendar.DATE, cal.getActualMaximum(Calendar.DATE)); // changed calendar to cal
Date lastDateOfPreviousMonth = cal.getTime();
查看强>
答案 1 :(得分:6)
YearMonth.now().minusMonths( 1 ).atDay( 1 )
...和...
YearMonth.now().minusMonths( 1 ).atEndOfMonth()
避免使用捆绑的java.util.Date和.Calendar类,因为它们非常麻烦。而是在Java 8及更高版本中使用java.time package。
Java 8中的新java.time framework(Tutorial)具有此命令。
恰当命名的YearMonth
课程代表一年中的一个月,没有任何特定的日期或时间。从那里我们可以要求这个月的第一天和最后一天。
ZonedId zoneId = ZoneId.of( "America/Montreal" );
YearMonth yearMonthNow = YearMonth.now( zoneId );
YearMonth yearMonthPrevious = yearMonthNow.minusMonths( 1 );
LocalDate firstOfMonth = yearMonthPrevious.atDay( 1 );
LocalDate lastOfMonth = yearMonthPrevious.atEndOfMonth();
更新 Joda-Time项目现在位于maintenance mode,团队建议迁移到java.time课程。请参阅Tutorial by Oracle。
在Joda-Time 2.8中,如果您不关心时间,请使用LocalDate
课程。
LocalDate today = LocalDate.now( DateTimeZone.forID( "Europe/Paris" ) );
LocalDate firstOfThisMonth = today.withDayOfMonth( 1 );
LocalDate firstOfLastMonth = firstOfThisMonth.minusMonths( 1 );
LocalDate endOfLastMonth = firstOfThisMonth.minusDays( 1 );
java.time框架内置于Java 8及更高版本中。这些类取代了麻烦的旧legacy日期时间类,例如java.util.Date
,Calendar
和& SimpleDateFormat
现在位于Joda-Time的maintenance mode项目建议迁移到java.time类。
要了解详情,请参阅Oracle Tutorial。并搜索Stack Overflow以获取许多示例和解释。规范是JSR 310。
您可以直接与数据库交换 java.time 对象。使用符合JDBC driver或更高版本的JDBC 4.2。不需要字符串,不需要java.sql.*
类。
从哪里获取java.time类?
ThreeTen-Extra项目使用其他类扩展java.time。该项目是未来可能添加到java.time的试验场。您可以在此处找到一些有用的课程,例如Interval
,YearWeek
,YearQuarter
和more。
答案 2 :(得分:3)
使用JodaTime
DateMidnight now = new DateMidnight();
DateMidnight beginningOfLastMonth = now.minusMonths(1).withDayOfMonth(1);
DateMidnight endOfLastMonth = now.withDayOfMonth(1).minusDays(1);
System.out.println(beginningOfLastMonth);
System.out.println(endOfLastMonth);
输出:
2012-04-01T00:00:00.000 + 02:00
2012-04-30T00:00:00.000 + 02:00
说明:DateMidnight对象是一个没有时间信息的日期对象,看起来就像您需要的那样。如果没有,请在上面的代码中用DateTime替换所有出现的DateMidnight。
答案 3 :(得分:2)
你可以创建一个日历对象,将日期设置为当前月份的第一天(应该是第一个:P)然后你可以做两个操作: 从您的日历对象中,您可以减去特定的时间段,例如一个月(这会给你上个月的第一个日期,或一天,这将给你上个月的最后一天。我没有尝试,但这将是我的第一步。
答案 4 :(得分:2)
//在模式中,您可以使用所需的格式。
DateTimeFormatter format = DateTimeFormatter.ofPattern("MM/dd/yyyy");
LocalDate now = LocalDate.now();
String startDate = now.minusMonths(1).with(TemporalAdjusters.firstDayOfMonth()).format(format);
String endDate = now.minusMonths(1).with(TemporalAdjusters.lastDayOfMonth()).format(format);
答案 5 :(得分:1)
还想为Jigar的答案添加一些东西。使用DateFormat
类以问题中指定的格式获取日期:
DateFormat df = DateFormat.getInstance(DateFormat.SHORT);
System.out.println(df.format(firstDateOfPreviousMonth));
System.out.println(df.format(lastDateOfPreviousMonth));
输出:
04/01/12
04/30/12
答案 6 :(得分:1)
public static LocalDate getPreviousMonthStartDate() {
return LocalDate.now().minusMonths(1).with(TemporalAdjusters.firstDayOfMonth());
}
public static LocalDate getPreviousMonthLastDate() {
return LocalDate.now().minusMonths(1).with(TemporalAdjusters.lastDayOfMonth());
}
使用Java.Time非常容易编写代码。 java.time程序包具有更好的设计,更多的线程安全性,许多支持常用操作的实用程序方法,并且易于使用Local和ZonedDate / Time API处理时区。
答案 7 :(得分:0)
Calendar cal = Calendar.getInstance();
cal.set(Calendar.DATE, 1);
cal.add(Calendar.DAY_OF_MONTH, -1);
Date lastDateOfPreviousMonth = cal.getTime();
cal.set(Calendar.DATE, 1);
Date firstDateOfPreviousMonth = cal.getTime();
答案 8 :(得分:0)
<!DOCTYPE html>
<head>
<meta charset="UTF-8">
<title>Test</title>
<script type="text/javascript">
function concatme()
{
var num1 = document.getElementById("num1").value;
var num2 = document.getElementById("num2").value;
document.getElementById("response").innerText = num1 + ' ' +num2;
}
</script>
</head>
<body>
<form method="GET">
<input type="text" name="num1" id="num1" placeholder="Number 1">
<input type="text" name="num2" id="num2" placeholder="Number 2">
</form>
<br>
<button value="submit" onclick="concatme()">Generate</button>
<p id="response"></p>
</body>
</html>