文档章节

浅谈JAVA中Calendar类FirstDayOfWeek的问题

hnzmdpan
 hnzmdpan
发布于 2017/03/30 17:59
字数 962
阅读 735
收藏 20

Calendar类的getFirstDayOfWeek

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

getMinimalDaysInFirstWeek

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

以上是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号。

此文到此结束。

© 著作权归作者所有

hnzmdpan
粉丝 2
博文 14
码字总数 5427
作品 0
天津
程序员
私信 提问
加载中

评论(5)

sucho
sucho
我居然没有看懂....
rock912
rock912
楼主对一年的开始几天和最后几天属于哪一周有研究吗
麦麸子lee
麦麸子lee
getFirstDayOfWeek() == Calendar.SUNDAY 可以判断当前设置的日期中,一周的第一天是星期一还是星期天
yakamy
yakamy

引用来自“抓瓦工人”的评论

啥年代了还用这个,如果不用jdk8 就用joda-time吧,以前的日历难用死了
我感觉calendar的有些方法还是很有用的,比如getActualMinimum,getActualMaximum
pantrick
pantrick
啥年代了还用这个,如果不用jdk8 就用joda-time吧,以前的日历难用死了
浅谈Kotlin(一):简介及Android Studio中配置

浅谈Kotlin(一):简介及Android Studio中配置 浅谈Kotlin(二):基本类型、基本语法、代码风格 浅谈Kotlin(三):类 浅谈Kotlin(四):控制流 前言:   今日新闻:谷歌宣布,将Kotli...

听着music睡
2017/05/18
0
0
赶紧重写 Java 的时间和日期 API 吧!

最近 Java.net 的投票问题是:“在 Java 8 中实现 JSR-310(新的 Java 日期和时间 API)有多么重要? ”在这篇帖子发布的时候,对该话题已经有超过 150 条回应。其中“觉得非常重要”(53%),“...

墙头草
2012/03/27
5K
26
joda-time 时间处理工具

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/kisscatforever/article/details/89240738 一、前言 说到java的时间处理,我们一般用到的有包里面的 和 类里面...

AresCarry
04/12
0
0
java和mysql之间的时间日期类型传递

mysql(版本:5.1.50)的时间日期类型如下: datetime 8bytes xxxx-xx-xx xx:xx:xx 1000-01-01 00:00:00到9999-12-31 23:59:59 timestamp 4bytes xxxx-xx-xx xx:xx:xx 1970-01-01 00:00:01到......

为了美好的明天
2017/10/31
59
0
浅谈ThreadLocal原理

前言: 经过一宿的面壁思过,下文写的对ThreadLocal的源码分析,过于枯燥乏味,现在简单的总结一下ThreadLocal,提高一下做人的level。 ThreadLocal的作用就是:线程安全。 ThreadLocal的本质...

青衣霓裳
2018/11/15
123
0

没有更多内容

加载失败,请刷新页面

加载更多

关于AsyncTask的onPostExcute方法是否会在Activity重建过程中调用的问题

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。 本文链接:https://blog.csdn.net/XG1057415595/article/details/86774575 假设下面一种情况...

shzwork
今天
6
0
object 类中有哪些方法?

getClass(): 获取运行时类的对象 equals():判断其他对象是否与此对象相等 hashcode():返回该对象的哈希码值 toString():返回该对象的字符串表示 clone(): 创建并返此对象的一个副本 wait...

happywe
今天
6
0
Docker容器实战(七) - 容器中进程视野下的文件系统

前两文中,讲了Linux容器最基础的两种技术 Namespace 作用是“隔离”,它让应用进程只能看到该Namespace内的“世界” Cgroups 作用是“限制”,它给这个“世界”围上了一圈看不见的墙 这么一...

JavaEdge
今天
8
0
文件访问和共享的方法介绍

在上一篇文章中,你了解到文件有三个不同的权限集。拥有该文件的用户有一个集合,拥有该文件的组的成员有一个集合,然后最终一个集合适用于其他所有人。在长列表(ls -l)中这些权限使用符号...

老孟的Linux私房菜
今天
7
0
面试套路题目

作者:抱紧超越小姐姐 链接:https://www.nowcoder.com/discuss/309292?type=3 来源:牛客网 面试时候的潜台词 抱紧超越小姐姐 编辑于 2019-10-15 16:14:56APP内打开赞 3 | 收藏 4 | 回复24 ...

MtrS
今天
5
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部