在java中,如何获得上个月的周数,从周一开始的一周
cal.setFirstDayOfWeek(Calendar.MONDAY);
cal
是Calendar
个实例
如果星期的第一天不是星期一,则返回0。所以它必须算上周的前几个月,这是我的要求。
答案 0 :(得分:1)
您的问题不是很明确,但可能您正在寻找类似的内容:
Calendar cal = Calendar.getInstance();
cal.setTime(new Date()); // today's date
// previous month from today
cal.add(Calendar.MONTH, -1);
// get to the 1st week
cal.add(Calendar.DATE, -7 * (cal.get(Calendar.DAY_OF_MONTH)/7));
// Get to the 1st Mon of last month
cal.set(Calendar.DAY_OF_WEEK, Calendar.MONDAY);
// # of days in last month
int maxDay = cal.getActualMaximum(Calendar.DAY_OF_MONTH);
// print # of week since Mon of last month
int numWeeks = ((maxDay-cal.get(Calendar.DATE))/7)+1;
System.out.printf("# of weeks from Mon in last month: %d%n", numWeeks);
答案 1 :(得分:0)
快速而肮脏(考虑到我上述评论中提出的要求):
public static void main(String[] args) {
Calendar cal = Calendar.getInstance();
cal.add(Calendar.MONTH, -1);
cal.set(Calendar.DAY_OF_MONTH,1);
while ( cal.get(Calendar.DAY_OF_WEEK) != Calendar.MONDAY ) {
cal.add(Calendar.DAY_OF_WEEK, 1);
}
int startingMonth = cal.get(Calendar.MONTH);
int numberOfWeeks = 0;
while (cal.get(Calendar.MONTH) == startingMonth ) {
cal.add(Calendar.WEEK_OF_MONTH, 1);
numberOfWeeks++;
}
System.out.println("weeks in last month:" + numberOfWeeks);
}
答案 2 :(得分:0)
如果你想计算上个月的所有星期一,那么你就是:
public int getNofWeeks() {
Calendar cal = Calendar.getInstance();
while (cal.get(Calendar.DAY_OF_WEEK) != Calendar.MONDAY) {
cal.roll(Calendar.DATE, false);
}
int currentMonth = cal.get(Calendar.MONTH);
int previousMonth = (currentMonth + 12 - 1) % 12;
int prePreviousMonth = (currentMonth + 12 - 2) % 12;
int nofWeeks = 0;
do {
int month = cal.get(Calendar.MONTH);
if (month == previousMonth) {
nofWeeks++;
}
if (month == prePreviousMonth) {
break;
}
cal.roll(Calendar.WEEK_OF_YEAR, false);
} while (true);
return nofWeeks;
}
答案 3 :(得分:0)
避免使用现在由java.time类取代的麻烦的旧日期时间类。
如果您的Calendar
实际上是GregorianCalendar
,请转换为ZonedDateTime
。
GregorianCalendar gc = (GregorianCalendar) myCal;
ZonedDateTime zdt = gc.toZonedDateTime();
提取仅限日期。
LocalDate ld = zdt.toLocalDate();
本月的第一个,下个月的第一个。使用TemporalAdjuster
中定义的TemporalAdjusters
(注意复数形式)。
LocalDate firstOfThisMonth = ld.with( TemporalAdjusters.firstDayOfMonth() );
LocalDate firstOfNextMonth = ld.with( TemporalAdjusters.firstDayOfNextMonth() );
计算两周之间的数周。
long weeks = ChronoUnit.WEEKS.between( firstOfThisMonth , firstOfNextMonth );
如果您希望在星期一到星期一,请使用TemporalAdjuster
中已定义的TemporalAdjusters
与DayOfWeek
枚举对象的不同java.time。
LocalDate firstMondayOfThisMonth = ld.with( TemporalAdjusters.firstInMonth( DayOfWeek.MONDAY ) );
LocalDate firstMondayOfNextMonth = ld.plusMonths( 1 ).with( TemporalAdjusters.firstInMonth( DayOfWeek.MONDAY ) );
long weeks = ChronoUnit.WEEKS.between( firstMondayOfThisMonth , firstMondayOfNextMonth );
legacy框架内置于Java 8及更高版本中。这些类取代了麻烦的旧java.util.Date
日期时间类,例如Calendar
,SimpleDateFormat
和& Joda-Time
现在位于maintenance mode的java.time项目建议迁移到Oracle Tutorial类。
要了解详情,请参阅JSR 310。并搜索Stack Overflow以获取许多示例和解释。规范是JDBC driver。
您可以直接与数据库交换 java.time 对象。使用符合JDBC 4.2或更高版本的Java SE 8。不需要字符串,不需要java.sql.*
类。
从哪里获取java.time类?
Interval
项目使用其他类扩展java.time。该项目是未来可能添加到java.time的试验场。您可以在此处找到一些有用的课程,例如YearWeek
,YearQuarter
,more和https://jsfiddle.net/ywz6djqb/。