Calendar类

接触java不久,感觉java真的挺好玩的。

Calendar 类是一个抽象类,它为特定瞬间与一组诸如 YEARMONTHDAY_OF_MONTHHOUR 等日历字段之间的转换提供了一些方法,并为操作日历字段(例如获得下星期的日期)提供了一些方法。

在书上看到一个挺好玩的代码,通过这个代码浅浅的研究了下java中的Calendar类

输出的结果是:

PS:为了学习和理解方便,我将时间调回2011年,因为2012年刚好1月1号刚好是周日。

字段操作:

三种:set(),add(),roll();

set(f, value) 将日历字段 f 更改为 value。此外,它设置了一个内部成员变量,以指示日历字段 f 已经被更改。尽管日历字段 f 是立即更改的,但是直到下次调用 get()getTime()getTimeInMillis()add()roll() 时才会重新计算日历的时间值(以毫秒为单位)。因此,多次调用 set() 不会触发多次不必要的计算。使用 set() 更改日历字段的结果是,其他日历字段也可能发生更改,这取决于日历字段、日历字段值和日历系统。此外,在重新计算日历字段之后,get(f) 没必要通过调用 set 方法返回 value 集合。具体细节是通过具体的日历类确定的。

 

示例:假定 GregorianCalendar 最初被设置为 1999 年 8 月 31 日。调用 set(Calendar.MONTH, Calendar.SEPTEMBER) 将该日期设置为 1999 年 9 月 31 日。如果随后调用 getTime(),那么这是解析 1999 年 10 月 1 日的一个暂时内部表示。但是,在调用 getTime() 之前调用 set(Calendar.DAY_OF_MONTH, 30) 会将该日期设置为 1999 年 9 月 30 日,因为在调用 set() 之后没有发生重新计算。

 

  个人建议先跳过规则看下示例,然后再回过来理解。

add(f, delta)delta 添加到 f 字段中。这等同于调用 set(f, get(f) + delta),但要带以下两个调整:

  Add 规则 1。调用后 f 字段的值减去调用前 f 字段的值等于 delta,以字段 f 中发生的任何溢出为模。溢出发生在字段值超出其范围时,结果,下一个更大的字段会递增或递减,并将字段值调整回其范围内。

  Add 规则 2。如果期望某一个更小的字段是不变的,但让它等于以前的值是不可能的,因为在字段 f 发生更改之后,或者在出现其他约束之后,比如时区偏移量发生更改,它的最大值和最小值也在发生更改,然后它的值被调整为尽量接近于所期望的值。更小的字段表示一个更小的时间单元。HOUR 是一个比 DAY_OF_MONTH 小的字段。对于不期望是不变字段的更小字段,无需进行任何调整。日历系统会确定期望不变的那些字段。

此外,与 set() 不同,add() 强迫日历系统立即重新计算日历的毫秒数和所有字段。

 

示例:假定 GregorianCalendar 最初被设置为 1999 年 8 月 31 日。调用 add(Calendar.MONTH, 13) 将日历设置为 2000 年 9 月 30 日。Add 规则 1MONTH 字段设置为 September,因为向 August 添加 13 个月得出的就是下一年的 September。因为在 GregorianCalendar 中,DAY_OF_MONTH 不可能是 9 月 31 日,所以 add 规则 2DAY_OF_MONTH 设置为 30,即最可能的值。尽管它是一个更小的字段,但不能根据规则 2 调整 DAY_OF_WEEK,因为在 GregorianCalendar 中的月份发生变化时,该值也需要发生变化。

 

以下是代码,书上的代码及注释+我自己的理解和调试观察。

import java.text.DateFormatSymbols;
import java.util.*;

/**
*
@version 1.4 2007-04-07
*
@author Cay Horstmann
*/

public class CalendarTest
{
public static void main(String[] args)
{
// construct d as current date
//GregorianCalendar 是 Calendar 的一个具体子类,提供了世界上大多数国家/地区使用的标准日历系统。
//用来表示默认地区。默认时区的当前时间。
GregorianCalendar d = new GregorianCalendar();

int today = d.get(Calendar.DAY_OF_MONTH);
int month = d.get(Calendar.MONTH);//0为第一个月

//以下一段代码是测试,类里面的一些方法,测试娱乐。
/*
* int hour = d.get(Calendar.HOUR_OF_DAY);//0~23
* int minute = d.get(Calendar.MINUTE); //0~59
* int second = d.get(Calendar.SECOND); //0~59
* System.out.println(month+1+"月"+today+"日"+hour+"时"+minute+"分"+second+"秒");
*/

// set d to start date of the month
d.set(Calendar.DAY_OF_MONTH, 1);

//Sunday==1; 1<=weekday<=7;
int weekday = d.get(Calendar.DAY_OF_WEEK);
//因为是周六,所以weekday == 7;
//System.out.println(weekday);

// get first day of week (Sunday in the U.S.)
int firstDayOfWeek = d.getFirstDayOfWeek();
//firstDayOfWeek==1;

// determine the required indentation for the first line
int indent = 0;
//一周的第一天是否是月的第一天,如果不是,则追溯到上个月找到这个周的第一天所在的时间。
while (weekday != firstDayOfWeek)
{
indent++;
d.add(Calendar.DAY_OF_MONTH, -1);
weekday = d.get(Calendar.DAY_OF_WEEK);
//int temp=d.get(Calendar.DAY_OF_MONTH);
//System.out.println(temp);
}

/*
* DateFormatSymbols 是用于压缩本地化的日期_时间格式化数据,如月份名称、星期名称和时区数据的公有类。
*
* public String[] getShortWeekdays()
* 获得短型工作日字符串。 例如:"Sun", "Mon" 等。
* 返回值:短型工作日字符串。
*/
// print weekday names
String[] weekdayNames = new DateFormatSymbols().getShortWeekdays();
/*
* 以下循环操作类似于这个,但是前面一系列操作用于确定第一天是从周几开始(因地区而异)。所以不用我下面这两行程序
* for(int i=1; i<=7; i++)
* System.out.printf("%s", weekdayNames[i]);
*
* 此时:weekday == firstDayOfWeek
* 但地下循环为先执行后判断,即从周的选定的第一天 开始循环7次
*/
do
{
System.out.printf("%4s", weekdayNames[weekday]);
d.add(Calendar.DAY_OF_MONTH, 1);
weekday = d.get(Calendar.DAY_OF_WEEK);
}while (weekday != firstDayOfWeek);
System.out.println();

//月的1号一般不是从周的第一天开始。比如:周的第一天是周日,而2011年的第一天是周六,空出前6天的位置。
for (int i = 1; i <= indent; i++)
System.out.print(" ");

d.set(Calendar.DAY_OF_MONTH, 1);
do
{
// print day
int day = d.get(Calendar.DAY_OF_MONTH);
System.out.printf("%3d", day);

// mark current day with *
if (day == today) System.out.print("*");
else System.out.print(" ");

// advance d to the next day
d.add(Calendar.DAY_OF_MONTH, 1);
weekday = d.get(Calendar.DAY_OF_WEEK);

// start a new line at the start of the week
if (weekday == firstDayOfWeek) System.out.println();
}while (d.get(Calendar.MONTH) == month);
// the loop exits when d is day 1 of the next month

// print final end of line if necessary
if (weekday != firstDayOfWeek) System.out.println();
}
}

 

 

 

转载于:https://www.cnblogs.com/FreeAquar/archive/2012/01/17/2325069.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/302959.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

史上最牛的5次黑客攻击!比电影还刺激!

好莱坞认为&#xff0c;黑客就像是使用计算机的黑魔导士。在电影中&#xff0c;计算机可以炸毁房屋&#xff0c;关闭公路&#xff0c;释放瘟疫还有引发女权运动。也许有人认为&#xff0c;好莱坞的想象力很丰满&#xff0c;但现实是骨感的。他们错了&#xff0c;因为在现实中&a…

优化 .NET Core logging 中的泛型 logger

优化 .NET Core logging 中的泛型 loggerIntro在微软的 logging 组件中&#xff0c;我们可以比较方便的使用泛型 Logger&#xff0c;如&#xff1a;ILogger<Generic> 这样的&#xff0c;但是如果泛型 Logger 的类型是一个泛型类型就会有些问题&#xff0c;具体的泛型参数…

charts漏斗图表_ECharts漏斗图属性与实例介绍

ECharts漏斗图在 ECharts 系列中&#xff0c;漏斗图使用 series[i]-funnel 表示。漏斗图适用于业务流程比较规范、周期长、环节多的流程分析&#xff0c;通过漏斗各环节业务数据的比较&#xff0c;能够直观地发现和说明问题所在。示例&#xff1a;ECharts漏斗图属性type在漏斗图…

原来R语言还有这些不为人知的用处!

开学钜惠已经进行了好些天啦&#xff0c;前两天小天介绍了关于python课程的开学季限时优惠&#xff08;传送门&#xff09;&#xff0c;你以为这样就结束了吗&#xff1f;不不不&#xff0c;还有R语言系列的优惠没讲过呢。接下来&#xff0c;小天来详细说明一下&#xff01;19月…

记一次 .NET医院公众号程序 线程CPU双高分析

一&#xff1a;背景 1. 讲故事上周四有位朋友加wx咨询他的程序出现 CPU 线程 双高的情况&#xff0c;希望我能帮忙排查下&#xff0c;如下图&#xff1a;从截图看只是线程爆高&#xff0c;没看到 cpu 爆高哈????????????&#xff0c;有意思的是这位朋友说他&#…

谷歌搜索,揭示人性最黑暗的5个秘密

《卫报》网站发布文章指出&#xff0c;我们能够从我们在网上问的问题获得对自己更多的了解呢。美国数据科学家塞斯斯蒂芬斯-大卫多维茨&#xff08;Seth Stephens-Davidowitz&#xff09;通过分析谷歌的匿名搜索数据&#xff0c;揭示了我们最黑暗的一些秘密&#xff0c;揭露了我…

通过Dapr实现一个简单的基于.net的微服务电商系统(七)——一步一步教你如何撸Dapr之服务限流...

在一般的互联网应用中限流是一个比较常见的场景&#xff0c;也有很多常见的方式可以实现对应用的限流比如通过令牌桶通过滑动窗口等等方式都可以实现&#xff0c;也可以在整个请求流程中进行限流比如客户端限流就是在客户端通过随机数直接返回成功失败来决定是否发起请求。也可…

(转)完美画质 3D游戏反锯齿技术浅析 .

完美的画面已经离我们不再遥远——反锯齿技术浅析 不管现今的游戏画面有多完美&#xff0c;人物和环境有多真实&#xff0c;但游戏画面的构成的主要方式仍然没有得到改善&#xff1a;一帧画面由成千上万像素构成。这意味着物体多边形的轮廓最终是锯齿状的图形。所以画面质量不可…

业余时间学数据分析,如何快速上手

广泛被应用的数据分析谷歌的数据分析可以预测一个地区即将爆发的流感&#xff0c;从而进行针对性的预防&#xff1b;淘宝可以根据你浏览和消费的数据进行分析&#xff0c;为你精准推荐商品&#xff1b;口碑极好的网易云音乐&#xff0c;通过其相似性算法&#xff0c;为不同的人…

64位Visual Studio 2022,微软在下一盘大棋!

有没有跟我一样奇怪过&#xff0c;都2021年了&#xff0c;用的还是VS2019&#xff1f;原来微软是憋大招去了&#xff0c;4月18号Amanda的一篇博文宣布了一则重磅消息——Visual Studio 2022 首个预览版将于今年夏季发布 &#xff0c;并且终于成为万众期待的 64 位版&#xff01…

【重磅】MIT发布2018年“全球十大突破性技术”

“有些技术已经应用多年&#xff0c;有些则是意外之喜。无论如何&#xff0c;以下是我们认为将在未来的几年对我们的工作和生活产生巨大影响的技术突破。”北京时间2018年2月21日&#xff0c;《麻省理工科技评论》揭晓了2018年“全球十大突破性技术”&#xff0c;这份全球新兴科…

[Stardust]星尘配置中心

在分布式系统开发中&#xff0c;配置中心必不可少。在中通几年时间里&#xff0c;为了配合大数据计算平台&#xff0c;统一管理数百个微小应用&#xff0c;设计了一套轻量级配置中心。星尘配置中心在其理念基础上改进&#xff0c;针对中小团队而全新设计&#xff01;源码&#…

大数据可视化设计到底是啥,该怎么用

大数据可视化是个热门话题&#xff0c;在信息安全领域&#xff0c;也由于很多企业希望将大数据转化为信息可视化呈现的各种形式&#xff0c;以便获得更深的洞察力、更好的决策力以及更强的自动化处理能力&#xff0c;数据可视化已经成为网络安全技术的一个重要趋势。文章目录一…

WPF 如何实现颜色值拾取

WPF开发者QQ群&#xff1a; 340500857 前言如何进行颜色值拾取&#xff1f;这里采用的是调用WindowsAPI进行实现。吸取 沙漠尽头的狼 的建议多写一些文字进行描述。效果图如下&#xff1a;第一步 注册WindowsAPI 代码如下&#xff1a;[DllImport("user32.dll")]stati…

仿Google+相册的动画

在使用Google的时候&#xff0c;查看某一相册&#xff0c;会经常看到&#xff0c;如下图所示的动画效果。 鼠标移入、移出时均有动画效果&#xff0c;咋一看估计是使用了css3的transform属性来实现动画效果的。 在网上搜索“Google 相册 效果”的时候发现有人使用CSS3做了这样的…

看见到洞见之引子(二)机器学习算法

《看见到洞见》系列文章汇聚、分享的是绿盟科技创新中心对于数据分析在安全领域应用的技战术思考与经验&#xff0c;力求由浅入深层次递进&#xff0c;实战到方法论双线剖析。此文为系列文章之引子第二篇&#xff0c;深入浅出的对常用的数据分析和机器学习的算法进行介绍。在上…

一图看懂 ASP.NET Core 中的服务生命周期

翻译自 Waqas Anwar 2020年11月8日的文章 《ASP.NET Core Service Lifetimes (Infographic)》 [1]ASP.NET Core 支持依赖关系注入&#xff08;DI&#xff09;软件设计模式&#xff0c;该模式允许我们注册服务、控制如何实例化这些服务并将其注入到不同的组件中。一些服务可以在…

看见到洞见之引子(一)机器学习算法

《看见到洞见》系列文章汇聚、分享的是绿盟科技创新中心对于数据分析在安全领域应用的技战术思考与经验&#xff0c;力求由浅入深层次递进&#xff0c;实战到方法论双线剖析。此文为系列文章之引子第一篇&#xff0c;深入浅出的对常用的数据分析和机器学习的算法进行介绍。文章…

支持向量回归代码_RDKit:基于支持向量回归(SVR)预测logP

RDKit一个用于化学信息学的python库。使用支持向量回归(SVR)来预测logP。 分子的输入结构特征是摩根指纹&#xff0c;输出是logP。代码示例&#xff1a;#导入依赖库import numpy as npfrom rdkit import Chemfrom rdkit.Chem.Crippen import MolLogPfrom rdkit import Chem, Da…

移除 ZooKeeper 的 kafka 2.8 ,更快了

这段时间招聘季&#xff0c;后台收到不少关于 Kafka 的问题&#xff0c;确实 Kafka 近两年的行情&#xff0c;可谓是水涨船高了。根本原因是&#xff0c;是 Apache Kafka 作为一款开源的消息引擎系统。凭借高可靠、高吞吐、高可用、可伸缩等优越特性&#xff0c;在数据采集、传…