【Java】日期Calendar类关于星期的问题

Calendar类的getFirstDayOfWeek

// 获取一星期的第一天;例如,在美国,这一天是 SUNDAY,而在法国,这一天是 MONDAY
getFirstDayOfWeek() 

getMinimalDaysInFirstWeek

 //获取一年中第一个星期所需的最少天数,例如,如果定义第一个星期包含一年第一个月的第一天,则此方法将返回 1。
getMinimalDaysInFirstWeek() 
         

以上是JDK的解释,getFirstDayOfWeek还好理解,即,一周的第一天是周日,还是周一的问题。

getMinimalDaysInFirstWeek就显示比较难懂了。它的意思是指,一周里的天数。

来看个例子吧,比如我想得到,2017年的第3周的周一,是哪一天。好了,看代码吧。

package org.test.util;

import java.text.SimpleDateFormat;
import java.util.Calendar;

public class CalendarTest02 {
	static final String[] weeks = new String[] { "星期天", "星期一", "星期二", "星期三", "星期四", "星期五", "星期六", };

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");

		Calendar cale = Calendar.getInstance();
		System.out.println("现在是" + sdf.format(cale.getTime()));
		System.out.println("getFirstDayOfWeek默认值-->" + cale.getFirstDayOfWeek());
		System.out.println("getFirstDayOfWeek默认值-->" + weeks[cale.getFirstDayOfWeek() - 1]);

		cale.set(Calendar.YEAR, 2017);
		cale.set(Calendar.WEEK_OF_YEAR, 3);
		cale.set(Calendar.DAY_OF_WEEK, Calendar.MONDAY);
		System.out.println(sdf.format(cale.getTime()));

		System.out.println("--------------------------我是分割线------------------------");

		/**
		 * #####################################
		 */
		Calendar cale2 = Calendar.getInstance();
		System.out.println("现在是" + sdf.format(cale2.getTime()));

		cale2.setFirstDayOfWeek(Calendar.MONDAY); // 星期一
		System.out.println("getFirstDayOfWeek值-->" + weeks[cale2.getFirstDayOfWeek() - 1]);

		cale2.set(Calendar.YEAR, 2017);
		cale2.set(Calendar.WEEK_OF_YEAR, 3);
		cale2.set(Calendar.DAY_OF_WEEK, Calendar.MONDAY);
		System.out.println(sdf.format(cale2.getTime()));

		System.out.println("--------------------------我是分割线------------------------");

		/**
		 * #####################################
		 */
		Calendar cale3 = Calendar.getInstance();
		System.out.println("现在是" + sdf.format(cale3.getTime()));

		cale3.setFirstDayOfWeek(Calendar.MONDAY); // 星期一
		cale3.setMinimalDaysInFirstWeek(7); // 7天为一周
		System.out.println("getFirstDayOfWeek值-->" + weeks[cale3.getFirstDayOfWeek() - 1]);

		cale3.set(Calendar.YEAR, 2017);
		cale3.set(Calendar.WEEK_OF_YEAR, 3);
		cale3.set(Calendar.DAY_OF_WEEK, Calendar.MONDAY);
		System.out.println(sdf.format(cale3.getTime()));
	}

}

程序的输出为

现在是2017-03-30
getFirstDayOfWeek默认值-->1
getFirstDayOfWeek默认值-->星期天
2017-01-16
--------------------------我是分割线------------------------
现在是2017-03-30
getFirstDayOfWeek值-->星期一
2017-01-09
--------------------------我是分割线------------------------
现在是2017-03-30
getFirstDayOfWeek值-->星期一
2017-01-16

看到了吧,一会说是1月16号,一会说是1月9号。最后一段,是为了演示getMinimalDaysInFirstWeek、setMinimalDaysInFirstWeek。

第一部分的输出,

现在是2017-03-30
getFirstDayOfWeek默认值-->1
getFirstDayOfWeek默认值-->星期天
2017-01-16


很好的解释了一周当中的第一天的问题,看以看到默认为星期天。注意这里的1代表星期天,int类型代表的含义如下所示

// Sun.(Sunday) 星期天
	public final static int SUNDAY = 1;

	// Mon.(Monday) 星期一
	public final static int MONDAY = 2;

	// Tue.(Tuesday) 星期二
	public final static int TUESDAY = 3;

	// Wed.(Wednesday) 星期三
	public final static int WEDNESDAY = 4;

	// Thu.(Thursday) 星期四
	public final static int THURSDAY = 5;

	// Fri.(Friday) 星期五
	public final static int FRIDAY = 6;

	// Sat.(Saturday) 星期六
	public final static int SATURDAY = 7;
好了,看到这里,想一下结果为什么是16号。其实很简单,脑子里可以想像下日历的样子,它是这个样子的


恩,不错,它就是window7里的样子。数一下呗,第3周,周一,呵呵,是16号了吧,没错吧。

再来看第二段输出

现在是2017-03-30
getFirstDayOfWeek值-->星期一
2017-01-09


呵呵,9号,这又是为什么呢?哦,原来代码里设置了一周的第一天是周一,看代码

cale2.setFirstDayOfWeek(Calendar.MONDAY); // 星期一

这个时候,日历的样子又变了,它是这个样子的



了,数一下吧,第三周,周一,是不是9号了。

别急,还没有完了,再来看第三段输出

现在是2017-03-30
getFirstDayOfWeek值-->星期一
2017-01-16


呵呵,也是16号,为什么呢?

其实在看下面这张图的时候,已经能说明情况了


虽然第一周只有一天,但它却代表了一周。历害吧,哈哈。这未免有点太当浪费了吧,我们生活中,可是7天一周啊,有没有办法控制一下呢?当然有啊,看下面的代码

cale3.setMinimalDaysInFirstWeek(7); // 7天为一周
行了,这样的话,它就老老实实的7天一周了。不太理解的话,你可以看上图那张图,自己动手数三周,看是不是16号。


  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值