上个月的java周计数

时间:2012-11-05 18:08:15

标签: java calendar

在java中,如何获得上个月的周数,从周一开始的一周

cal.setFirstDayOfWeek(Calendar.MONDAY);

calCalendar个实例

如果星期的第一天不是星期一,则返回0。所以它必须算上周的前几个月,这是我的要求。

4 个答案:

答案 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

避免使用现在由java.time类取代的麻烦的旧日期时间类。

如果您的Calendar实际上是GregorianCalendar,请转换为ZonedDateTime

GregorianCalendar gc = (GregorianCalendar) myCal;
ZonedDateTime zdt = gc.toZonedDateTime();

提取仅限日期。

LocalDate ld = zdt.toLocalDate();

第1至第1

本月的第一个,下个月的第一个。使用TemporalAdjuster中定义的TemporalAdjusters(注意复数形式)。

LocalDate firstOfThisMonth = ld.with( TemporalAdjusters.firstDayOfMonth() );
    LocalDate firstOfNextMonth = ld.with( TemporalAdjusters.firstDayOfNextMonth() );

计算两周之间的数周。

long weeks = ChronoUnit.WEEKS.between( firstOfThisMonth , firstOfNextMonth );

周一到周一

如果您希望在星期一到星期一,请使用TemporalAdjuster中已定义的TemporalAdjustersDayOfWeek枚举对象的不同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 );

关于 java.time

legacy框架内置于Java 8及更高版本中。这些类取代了麻烦的旧java.util.Date日期时间类,例如CalendarSimpleDateFormat和& Joda-Time

现在位于maintenance modejava.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的试验场。您可以在此处找到一些有用的课程,例如YearWeekYearQuartermorehttps://jsfiddle.net/ywz6djqb/