上个月的java周计数

上个月的java周计数,java,calendar,Java,Calendar,在java中,如何获得上个月的周数,即从周一开始的一周 cal.setFirstDayOfWeek(Calendar.MONDAY); cal是Calendar实例 如果一周的第一天不是星期一,则返回0。因此,它必须被计算为上周的前几个月,这是我的要求。快速和肮脏(考虑到我在上述评论中提出的要求): 您的问题不是很清楚,但可能您正在寻找以下内容: Calendar cal = Calendar.getInstance(); cal.setTime(new Date()); // today's

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

cal.setFirstDayOfWeek(Calendar.MONDAY);
cal
Calendar
实例

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

快速和肮脏(考虑到我在上述评论中提出的要求):


您的问题不是很清楚,但可能您正在寻找以下内容:

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);

如果您想计算上个月的所有周一,请访问:

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;
}
java.time 避免使用现在被java.time类取代的麻烦的旧日期时间类

如果您的
日历
实际上是一个
GregoriaCalendar
日历,则将其转换为
ZonedDateTime

GregorianCalendar gc = (GregorianCalendar) myCal;
ZonedDateTime zdt = gc.toZonedDateTime();
只提取日期

LocalDate ld = zdt.toLocalDate();
第一到第一 这个月的第一天,下个月的第一天。使用中定义的(注意复数形式)

计算两周之间的时间

long weeks = ChronoUnit.WEEKS.between( firstOfThisMonth , firstOfNextMonth );
星期一至星期一 如果要从星期一到星期一,请使用中已定义的不同枚举对象

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 该框架内置于Java8及更高版本中。这些类取代了麻烦的旧日期时间类,例如,&

该项目现已启动,建议迁移到类

要了解更多信息,请参阅。并搜索堆栈溢出以获得许多示例和解释。规格是

您可以直接与数据库交换java.time对象。使用兼容的或更高版本。不需要字符串,也不需要
java.sql.*

从哪里获得java.time类

  • 、和更高版本-标准Java API的一部分,带有捆绑实现。
    • Java9添加了一些次要功能和修复
    • 大多数java.time功能都在中向后移植到Java6和Java7
    • 更高版本的Android捆绑包实现了java.time类

    • 对于早期的Android(如何计算从一个月开始到下个月结束的周数?我想几个例子可能会让你的问题更清楚。所以你想要完整周数(即周一-周日)上个月包含哪些内容?如果我们看2012年10月,这将是4,11月将是3,对吗?谢谢Korgen,但上个月返回4,因为10月从周一开始有5周检查我的更改…这将提供上个月开始的周数(即上个月的周一数)第一个想法是,你只想计算完整的周数,但显然你也想要只开始的周数?!感谢anubhava,10月返回4周,但10月从周一开始有5周现在检查编辑。从你的问题看,你不清楚2012年10月是想要4周还是5周。上个月的周数从f开始rom星期一,本月是11月,10月是上个月,从10月的星期一开始有5个星期+1不是解决方案,因为它在大多数情况下不起作用
      在大多数情况下不起作用
      :你能告诉我一个具体的例子,当这个代码不起作用时吗?仅供参考,非常麻烦的旧日期-t现在,诸如和
      java.text.simpleDataFormat
      之类的ime类被java 8及更高版本中内置的类所取代。请参阅。
      long weeks = ChronoUnit.WEEKS.between( firstOfThisMonth , firstOfNextMonth );
      
      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 );