巧用Java中Calendar工具类
Java的JDK中提供了一系列好用的util工具类。Calendar就是java.util中用于处理日期的工具类。且该工具类易学易用实用。
工具类Calendar是抽象类。
PS:为什么把Calendar定义成抽象类呢?很简单,仔细想想就会知道:全世界有很多种计量日期的方式,所以要把Calendar定义成一个抽象类,日本有日历计量方式;而中国就有阳历阴历之说。
抽象类是不能New的,所以,通常我们会通过Calendar的子类来操作日期。我们通过 Calendar .getInstance()方法,能够拿到具体的日历子类实现。Calendar.getInstance()的源代码如下:
public static Calendar getInstance()
{
Calendar cal = createCalendar(TimeZone.getDefaultRef(), Locale.getDefault(Locale.Category.FORMAT));
cal.sharedZone = true;
return cal;
}
private static Calendar createCalendar(TimeZone zone,
Locale aLocale)
{
Calendar cal = null;
String caltype = aLocale.getUnicodeLocaleType("ca");
if (caltype == null) {
// Calendar type is not specified.
// If the specified locale is a Thai locale,
// returns a BuddhistCalendar instance.
if ("th".equals(aLocale.getLanguage())
&& ("TH".equals(aLocale.getCountry()))) {
cal = new BuddhistCalendar(zone, aLocale);
} else {
cal = new GregorianCalendar(zone, aLocale);
}
} else if (caltype.equals("japanese")) {
cal = new JapaneseImperialCalendar(zone, aLocale);
} else if (caltype.equals("buddhist")) {
cal = new BuddhistCalendar(zone, aLocale);
} else {
// Unsupported calendar type.
// Use Gregorian calendar as a fallback.
cal = new GregorianCalendar(zone, aLocale);
}
return cal;
}
那么Calendar.getInstance()这个方法都做了哪些事情呢?虽然方法被命名为getInstance(),但是它并不能说明Calendar是一个单例的。通过上面源代码我们就能略知一二。该方法,主要就是通过你所在的时区、日历格式,以及当前时间,确定这一时刻的Calendar对象。
PS:为什么Calendar不使用单例实现呢?很简单,仔细想一想,单例返回的永远都是一个对象,即对象的引用是相同的。故C1和C2两个日历对象,你改变了C1,那么C2自动改变显然不是你想要的。
Calendar工具类的使用很简单,但是JDK文档里面说的太过于繁琐了。所以我根据网上的一些资料,整理了一下:
public static void main(String[] args) {
// Calendar的子类
// GregorianCalendar
Calendar calendar = Calendar.getInstance();
calendar.setTime(new Date());
// 设置日期为2011-07-24 09:59:50
calendar.set(2011, 06, 24, 9, 59, 50);
// 12小时制
int temp12Hour = Calendar.HOUR;
// 24小时制
int temp24Hour = calendar.HOUR_OF_DAY;
// 显示年份
int yearIndex = Calendar.YEAR;
int year = calendar.get(yearIndex);
System.out.println("yearIndex=" + yearIndex);
System.out.println("year=" + year);
// 显示月份 (从0开始, 实际显示要加一)
int monthIndex = Calendar.MONTH;
int month = calendar.get(monthIndex) + 1;
System.out.println("monthIndex=" + monthIndex);
System.out.println("month=" + month);
// 今年的第几天
int dayOfYearIndex = Calendar.DAY_OF_YEAR;
int dayOfYear = calendar.get(dayOfYearIndex);
System.out.println("dayOfYearIndex=" + dayOfYearIndex);
System.out.println("dayOfYear=" + dayOfYear);
// 本月的第N天
int dayOfMonthIndex = Calendar.DAY_OF_MONTH;
int dayOfMonth = calendar.get(dayOfMonthIndex);
System.out.println("dayOfMonthIndex=" + dayOfMonthIndex);
System.out.println("dayOfMonth=" + dayOfMonth);
// 本周第N天,从周日开始
int dayOfWeek = calendar.get(Calendar.DAY_OF_WEEK) - 1;
if (dayOfWeek == 0) {
dayOfWeek = 7;
}
System.out.println("dayOfWeek=" + dayOfWeek);
// 三小时以后
int hourOfDayIndex = Calendar.HOUR_OF_DAY;
calendar.add(hourOfDayIndex, 3);
int afterThreeHour = calendar.get(hourOfDayIndex);
System.out.println("afterThreeHour=" + afterThreeHour);
// 当前分钟数
int minuteIndex = Calendar.MINUTE;
int minute = calendar.get(minuteIndex);
System.out.println("minuteIndex=" + minuteIndex);
System.out.println("minute=" + minute);
// 15分钟以后
calendar.add(minuteIndex, 15);
minute = calendar.get(minuteIndex);
System.out.println("minute+15=" + minute);
// 30分钟以前
calendar.add(minuteIndex, -30);
minute = calendar.get(minuteIndex);
System.out.println("minute-30=" + minute);
// 格式化显示
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss:SS");
String time = sdf.format(calendar.getTime());
System.out.println(time);
// 重置Calendar显示当前时间
calendar.setTime(new Date());
time = sdf.format(calendar.getTime());
System.out.println(time);
// 创建一个Calendar 用于比较时间
Calendar calendarNew = Calendar.getInstance();
// 设定为5小时以前,后者大,显示-1
calendarNew.add(Calendar.HOUR, -5);
System.out.println("时间比较:" + calendarNew.compareTo(calendar));
// 设定7小时以后,前者大 ,显示1
calendarNew.add(Calendar.HOUR, +7);
System.out.println("时间比较:" + calendarNew.compareTo(calendar));
// 退回2小时,时间相同,显示0
calendarNew.add(Calendar.HOUR, -2);
System.out.println("时间比较:" + calendarNew.compareTo(calendar));
// 创建两个日历对象
Calendar cal = Calendar.getInstance();
Calendar future = Calendar.getInstance();
// 打印当前日期
System.out.println("Current date: " + cal.getTime());
// 改变年份
future.set(Calendar.YEAR, 2066);
System.out.println("Year is " + future.get(Calendar.YEAR));
// 检查日期是否在当前日期之后
if (future.after(cal)) {
System.out.println("Date " + future.getTime() + " is after current date.");
}
}
日期操作,是Java编程中很重要的一部分,同时,它的简单易用更加让你青睐它。使用Calendar基本上能够帮助我们顺利完成百分之九十九点九九的工作。Calendar,你会了吗?
转载自:http://www.tuicool.com/articles/qeyAba
巧用Java中Calendar工具类的更多相关文章
- 使用java的Calendar工具类获取到本月的第一天起始时间和最后一天结束时间。
1.使用java的Calendar工具类获取到本月的第一天起始时间和最后一天结束时间. package com.fline.aic.utils; import java.text.DateFormat ...
- Java中的工具类究竟如何命名?
先来几个例子 JDK自带工具类 Arrays.asList(); Objects.equals(); Collections.sort(); Spring框架工具类 StringUtils.isEmp ...
- Java中的工具类和新特性
1:Collections集合框架工具类: /* 集合框架的工具类. Collections:集合框架的工具类.里面定义的都是静态方法. Collections和Collection有什么差别? Co ...
- 在Java中Arrays工具类实现功能的六种方法
使用Arrays工具类,要先导入包即:import.java.util.Arrays 以下是实现六种功能的方法: 1.比较两个数组值是否相等: 结果为true.false.(布尔型不能比较) int ...
- java高并发系列 - 第22天:java中底层工具类Unsafe,高手必须要了解
这是java高并发系列第22篇文章,文章基于jdk1.8环境. 本文主要内容 基本介绍. 通过反射获取Unsafe实例 Unsafe中的CAS操作 Unsafe中原子操作相关方法介绍 Unsafe中线 ...
- Java中Arrays工具类
以下是实现六种功能的方法: 1.比较两个数组值是否相等: 结果为true.false.(布尔型不能比较) int []a={10,20,30}; int []b={10,20,30}; int []c ...
- java中常用工具类
目录 一. org.apache.commons.io.IOUtils 二. org.apache.commons.io.FileUtils 三. org.apache.commons.lang.St ...
- HttpTool.java(在java tool util工具类中已存在) 暂保留
HttpTool.java 该类为java源生态的http 请求工具,不依赖第三方jar包 ,即插即用. package kingtool; import java.io.BufferedReader ...
- 简单了解Spring中常用工具类_java - JAVA
文章来源:嗨学网 敏而好学论坛www.piaodoo.com 欢迎大家相互学习 文件资源操作 Spring 定义了一个 org.springframework.core.io.Resource 接口, ...
随机推荐
- Scrum立会报告+燃尽图(Beta阶段第二次)
此作业要求参见:https://edu.cnblogs.com/campus/nenu/2018fall/homework/2384 项目地址:https://coding.net/u/wuyy694 ...
- 基于spec探路者团队贪吃蛇作品的评论
1 运动功能 由以上两图贪吃蛇的位置不同可知,运动功能实现.并且我能够通过使用键盘上的上下左右方位键控制蛇的移动方向,蛇在控制的方向上进行直线前进. 2 吃食物功能 以上两图可知吃食物功能实现.当界面 ...
- 2018软工实践—Alpha冲刺(1)
o## 队名 火箭少男100 组长博客 林燊大哥 作业博客 Alpha 冲鸭! 成员冲刺阶段情况 林燊(组长) 过去两天完成了哪些任务 协调各成员之间的工作,对多个目标检测及文字识别模型进行评估.实验 ...
- 福大软工1816:Alpha事后诸葛
福大软工·第十一次作业-Alpha事后诸葛亮 组长博客链接 本次作业博客链接 项目Postmortem 模板 设想和目标 我们的软件要解决什么问题?是否定义得很清楚?是否对典型用户和典型场景有清晰的描 ...
- DFS(DP)---POJ 1014(Dividing)
原题目:http://poj.org/problem?id=1014 题目大意: 有分别价值为1,2,3,4,5,6的6种物品,输入6个数字,表示相应价值的物品的数量,问一下能不能将物品分成两份,是两 ...
- HDU 5464 Clarke and problem 动态规划
题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=5464 Clarke and problem Accepts: 130 Submissions: ...
- 关于解决乱码问题的一点探索之一(涉及utf-8和GBK)
在使用Visual Studio 2005进行MFC开发的时候,发现自动添加的注释变成了乱码.像这样: // TODO: ÔÚ´ËÌí¼ÓרÓôúÂëºÍ/»òµ÷ÓûùÀà 还有这样: // ...
- Jquery获取属性值
jq获取某个标签内的属性值:$("#TeamPerformanceYearUl li:eq(0)").attr('data') jq获取li或者td第一个属性(索引值从零开始)$( ...
- 防御 XSS 的七条原则
本文将会着重介绍防御XSS攻击的一些原则,需要读者对于XSS有所了解,至少知道XSS漏洞的基本原理,如果您对此不是特别清楚,请参考这两篇文章:<Stored and Reflected XSS ...
- 主流的RPC框架有哪些
RPC是远程过程调用的简称,广泛应用在大规模分布式应用中,作用是有助于系统的垂直拆分,使系统更易拓展.Java中的RPC框架比较多,各有特色,广泛使用的有RMI.Hessian.Dubbo等.RPC还 ...