Java 我想得到一个月的周数
我想得到本月的周数,包括上个月最后一周的天数和下个月的第一周天数 大概是这样的: 我想在android上的某个gridview适配器中使用它,并尝试操作此代码块:Java 我想得到一个月的周数,java,android,calendar,Java,Android,Calendar,我想得到本月的周数,包括上个月最后一周的天数和下个月的第一周天数 大概是这样的: 我想在android上的某个gridview适配器中使用它,并尝试操作此代码块: //FIRST_DAY_OF_WEEK =0; int lastDay = month.getActualMaximum(Calendar.DAY_OF_MONTH); int firstDay = (int) month.get(Calendar.DAY_OF_WEEK); int
//FIRST_DAY_OF_WEEK =0;
int lastDay = month.getActualMaximum(Calendar.DAY_OF_MONTH);
int firstDay = (int) month.get(Calendar.DAY_OF_WEEK);
int firstDayNextMonth = nextMonth.get(Calendar.DAY_OF_WEEK);
int lastDayNextMonth=nextMonth.getActualMaximum(Calendar.DAY_OF_MONTH);
int nextMonthdays=nextMonth.getMinimalDaysInFirstWeek();
// figure size of the array
if (firstDay == 1) {
days = new String[lastDay + (FIRST_DAY_OF_WEEK * 6)];
}
else {
days = new String[lastDay + firstDay - (FIRST_DAY_OF_WEEK + 1)];
}
Calendar类的WEEK\u OF_YEAR属性对您很有用。参考: 创建一个新日期,该日期将是某个月的第一天。为这一天获取一年中的一周,假设您获得了起始值 创建一个新日期,该日期将是给定月份的最后一天。获取这一天的一周,这样现在就得到了终值 现在end-start+1应该是您想要的
Calendar cal = Calendar.getInstance();
cal.set(Calendar.YEAR, 2013);
cal.set(Calendar.MONTH, 1);
cal.set(Calendar.DAY_OF_MONTH, 1);
int start = cal.get(Calendar.WEEK_OF_YEAR);
Log.d("BLA BLA", "Value is " + start);
cal.set(Calendar.YEAR, 2013);
cal.set(Calendar.MONTH, 1);
cal.set(Calendar.DAY_OF_MONTH, 28);
int end = cal.get(Calendar.WEEK_OF_YEAR);
//Above line will not work for December Month, use following line for this
int end = isDecember?53:cal.get(Calendar.WEEK_OF_YEAR);
Log.d("BLA BLA", "Value is " + end);
Log.d("BLA BLA", "Num weeks:: " + (end - start +1 ));
当一周与另一年或类似的时间重叠时,你可能不得不处理一些紧急情况。但我认为一旦你做对了,你可以用简单的逻辑来做
下面是简单的示例代码。我认为你可以把它变成函数,传递你想要的任何东西
Calendar cal = Calendar.getInstance();
cal.set(Calendar.YEAR, 2013);
cal.set(Calendar.MONTH, 1);
cal.set(Calendar.DAY_OF_MONTH, 1);
int start = cal.get(Calendar.WEEK_OF_YEAR);
Log.d("BLA BLA", "Value is " + start);
cal.set(Calendar.YEAR, 2013);
cal.set(Calendar.MONTH, 1);
cal.set(Calendar.DAY_OF_MONTH, 28);
int end = cal.get(Calendar.WEEK_OF_YEAR);
//Above line will not work for December Month, use following line for this
int end = isDecember?53:cal.get(Calendar.WEEK_OF_YEAR);
Log.d("BLA BLA", "Value is " + end);
Log.d("BLA BLA", "Num weeks:: " + (end - start +1 ));
对于拐角处的情况:
Calendar cal = Calendar.getInstance();
for(int i = 0 ; i < 11;i++){
cal.set(Calendar.YEAR, 2013);
cal.set(Calendar.DAY_OF_MONTH, 1);
cal.set(Calendar.MONTH, i);
int maxWeeknumber = cal.getActualMaximum(Calendar.WEEK_OF_MONTH);
Log.d("LOG","max week number" + maxWeeknumber);
}
01-22 01:49:03.591: D/LOG(573): max week number5
01-22 01:49:03.602: D/LOG(573): max week number5
01-22 01:49:03.602: D/LOG(573): max week number6
01-22 01:49:03.671: D/LOG(573): max week number5
01-22 01:49:03.671: D/LOG(573): max week number5
01-22 01:49:03.671: D/LOG(573): max week number6
01-22 01:49:03.681: D/LOG(573): max week number5
01-22 01:49:03.691: D/LOG(573): max week number5
01-22 01:49:03.691: D/LOG(573): max week number5
01-22 01:49:03.711: D/LOG(573): max week number5
01-22 01:49:03.711: D/LOG(573): max week number5
Calendar cal = Calendar.getInstance();
for(int i = 0 ; i < 11;i++){
cal.set(Calendar.YEAR, 2010);
cal.set(Calendar.DAY_OF_MONTH, 1);
cal.set(Calendar.MONTH, i);
int maxWeeknumber = cal.getActualMaximum(Calendar.WEEK_OF_MONTH);
// Month value starts from 0 to 11 for Jan to Dec
Log.d("LOG","For Month :: "+ i + " Num Week :: " + maxWeeknumber);
}
角点情况仅发生在1月份(例如2010年1月、2000年1月),在这些情况下,大多数天数是前一年最后一周的一部分,因此起始值为52,结束值为5。发生这种情况时,请检查
if(start > end) {
numweeks = end + 1;
}
附言:把它放到你得到的不同测试输入中。如果您发现任何问题,请告诉我是否可以改进
甚至更简单的解决方案:
Calendar cal = Calendar.getInstance();
for(int i = 0 ; i < 11;i++){
cal.set(Calendar.YEAR, 2013);
cal.set(Calendar.DAY_OF_MONTH, 1);
cal.set(Calendar.MONTH, i);
int maxWeeknumber = cal.getActualMaximum(Calendar.WEEK_OF_MONTH);
Log.d("LOG","max week number" + maxWeeknumber);
}
01-22 01:49:03.591: D/LOG(573): max week number5
01-22 01:49:03.602: D/LOG(573): max week number5
01-22 01:49:03.602: D/LOG(573): max week number6
01-22 01:49:03.671: D/LOG(573): max week number5
01-22 01:49:03.671: D/LOG(573): max week number5
01-22 01:49:03.671: D/LOG(573): max week number6
01-22 01:49:03.681: D/LOG(573): max week number5
01-22 01:49:03.691: D/LOG(573): max week number5
01-22 01:49:03.691: D/LOG(573): max week number5
01-22 01:49:03.711: D/LOG(573): max week number5
01-22 01:49:03.711: D/LOG(573): max week number5
Calendar cal = Calendar.getInstance();
for(int i = 0 ; i < 11;i++){
cal.set(Calendar.YEAR, 2010);
cal.set(Calendar.DAY_OF_MONTH, 1);
cal.set(Calendar.MONTH, i);
int maxWeeknumber = cal.getActualMaximum(Calendar.WEEK_OF_MONTH);
// Month value starts from 0 to 11 for Jan to Dec
Log.d("LOG","For Month :: "+ i + " Num Week :: " + maxWeeknumber);
}
假设我们知道一个月的第一天(周六、周日等)
- 如果一个月的第一天是一个
而不是闰年,那么(修正编辑)周日
月份将只有4周。否则,在所有情况下,应至少有5周,最多6周二月
- 现在,如果您的月份从星期六开始,您将有6周的时间(如果是二月,则不包括5周)
- 现在,如果你的月份从星期五开始,你将有6周的时间,31天,其余5天
- 对于其他情况,它将始终是5周
找出一个月的第一天应该不难,您可以使用
日历
或其他日期/时间实用程序库类。但是,我想可能会有更干净的解决方案来消除角落案例和不必要的复杂性。使用每月一周会更好,没有跨年度问题
public static void main(String[] args) throws Exception {
for (String m : new String[] { "2012-11", "2012-12", "2013-01", "2013-02", "2013-03",
"2013-04", "2013-05", "2013-06" }) {
SimpleDateFormat format = new SimpleDateFormat("yyyy-MM");
Date date = format.parse(m);
Calendar c = Calendar.getInstance();
c.setTime(date);
int start = c.get(Calendar.WEEK_OF_MONTH);
c.add(Calendar.MONTH, 1);
c.add(Calendar.DATE, -1);
int end = c.get(Calendar.WEEK_OF_MONTH);
System.out.println(" # of weeks in " + format.format(c.getTime())
+ ": " + (end - start + 1));
}
}
结果:
# of weeks in 2012-11: 5
# of weeks in 2012-12: 6
# of weeks in 2013-01: 5
# of weeks in 2013-02: 5
# of weeks in 2013-03: 6
# of weeks in 2013-04: 5
# of weeks in 2013-05: 5
# of weeks in 2013-06: 6
如果你想用“手”
使用以下命令:
Date.prototype.getMonthWeek = function(monthAdjustement)
{
var firstDay = new Date(this.getFullYear(), this.getMonth(), 1).getDay();
var returnMessage = (Math.ceil(this.getDate()/7) + Math.floor(((7-firstDay)/7)));
return returnMessage;
}
其中,
monthadjustment
只是一个整数,用于调整您所查找的月份与今天日期的比较。我们可以使用calendar类,然后执行以下操作
Calendar calendar = Calendar.getInstance();
System.out.println(calendar.getActualMaximum(Calendar.WEEK_OF_MONTH));
这将返回当前月份的周数Java的日历API对于此类用例非常有用。 参考链接: 我假设你有一个月的开始日期
public static int getTotalNumberOfWeeks() throws ParseException {
Calendar calendar = Calendar.getInstance();
Date monthStartingDate = new SimpleDateFormat("yyyy-MM- dd").parse("2021-04-01");
calendar.setTime(monthStartingDate);
return calendar.getActualMaximum(Calendar.WEEK_OF_MONTH);
}
System.out.println(getTotalNumberOfWeeks(
WeekFields.SUNDAY_START, YearMonth.of(2013, Month.JANUARY)));
输出是预期的:
五,
关于一个较新的例子,我以2021年5月(下个月)为例。在我居住的地方,我们使用ISO周(从周一开始),让我们也尝试一下:
System.out.println(getTotalNumberOfWeeks(
WeekFields.ISO, YearMonth.of(2021, Month.MAY)));
六,
如果希望在JVM的默认区域设置中使用周,请使用WeekFields.of(locale.getDefault())
作为第一个参数。如果需要当前月份,可以将YearMonth.now(ZoneId.systemDefault())
作为第二个。为了方便起见,我声明了第二个参数aTemporal
。这允许您传递LocalDate
、YearMonth
、ZonedDateTime
、定义月份和年份的任何java.time类
ISO 8601是可能在世界大部分地区使用的国际标准,它将每月的第一周定义为每月至少有4天的第一周。这意味着在月初的第0周最多有三天。这就是为什么答案只关注月休假的最大周数。相反,我从最大周数中减去最小周数,再加上1,因为我们希望这两周都包含在计数中
链接
解释如何使用java.time。你的意思是从周日开始到周六结束的一周吗?@Swapnil是的,你是对的,如果选择了周二,你需要确定一个月有多少个周二?@Ramkiran不完全正确。我的场景可能也包括下个月的周二。这样行吗?:
int rows=Math.ceil(最后一天/7);
。你能帮我处理我提供的代码块吗。你可以看到,我已经得到了一些你暗示的值。让我试着把它们组合起来,作为例子。我有一个问题要问你。我想让你看看2010年1月的日历。在这种情况下,你期望的周数是多少?这是你要处理的最后一段代码吗ave角落案例证明?我想是soYes,我检查了2010年和2000年的角落案例,效果很好。我也准备把这方面的日志放进去。现在是完整的证明代码;)我想Vendetta提供了一个更干净的解决方案