Calendar 日历类的时间操作

时间:2022-12-09 19:15:28

我们经常会涉及到对时间的处理,例如登陆网站,我们会看到网站首页显示XXX,欢迎您!今天是XXXX年。。。。某些网站会记录下用户登陆的时间,比如银行的一些网站,对于这些经常需要处理的问题,Java中提供了Calendar这个专门用于对日期进行操作的类,那么这个类有什么特殊的地方呢,首先我们来看Calendar的声明

public abstract class Calendar extends Objectimplements Serializable, Cloneable, Comparable<Calendar>

该类被abstract所修饰,说明不能通过new的方式来获得实例,对此,Calendar提供了一个类方法getInstance,以获得此类型的一个通用的对象,getInstance方法返回一个Calendar对象(该对象为Calendar的子类对象),其日历字段已由当前日期和时间初始化:

Calendar rightNow = Calendar.getInstance();

为什么说返回的是Calendar的子类对象呢,因为每个国家地区都有自己的一套日历算法,比如西方国家的第一个星期大部分为星期日,而中国则为星期一,我们来看看getInstance方法获取实例的源码

/**
* Gets a calendar using the default time zone and locale. The
* <code>Calendar</code> returned is based on the current time
* in the default time zone with the default locale.
*
* @return a Calendar.
*/
public static Calendar getInstance()
{
Calendar cal = createCalendar(TimeZone.getDefaultRef(), Locale.getDefault(Locale.Category.FORMAT));
cal.sharedZone = true;
return cal;
}

注意事项:

Calendar 的 month 从 0 开始,也就是全年 12 个月由 0 ~ 11 进行表示。

而 Calendar.DAY_OF_WEEK 定义值如下,每周从 SUNDAY 开始,从 1 ~ 7:

Calendar.SUNDAY = 1
Calendar.MONDAY = 2
Calendar.TUESDAY = 3
Calendar.WEDNESDAY = 4
Calendar.THURSDAY = 5
Calendar.FRIDAY = 6
Calendar.SATURDAY = 7

Java Calendar 演示代码如下:

package demo;

import java.util.Date;
import java.text.SimpleDateFormat;
import java.text.DateFormat;
import java.text.ParseException;
import java.util.Calendar; public class Test
{
public Test()
{
} public static void main(String[] args)
{
// 字符串转换日期格式
// DateFormat fmtDateTime = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
// 接收传入参数
// String strDate = args[1];
// 得到日期格式对象
// Date date = fmtDateTime.parse(strDate); // 完整显示今天日期时间
String str = (new SimpleDateFormat("yyyy-MM-dd HH:mm:ss:SSS")).format(new Date());
System.out.println(str); // 创建 Calendar 对象
Calendar calendar = Calendar.getInstance(); try
{
// 对 calendar 设置时间的方法
// 设置传入的时间格式
SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-M-d H:m:s");
// 指定一个日期
Date date = dateFormat.parse("2013-6-1 13:24:16");
// 对 calendar 设置为 date 所定的日期
calendar.setTime(date); // 按特定格式显示刚设置的时间
str = (new SimpleDateFormat("yyyy-MM-dd HH:mm:ss:SSS")).format(calendar.getTime());
System.out.println(str);
}
catch (ParseException e)
{
e.printStackTrace();
} // 或者另一種設置 calendar 方式
// 分別爲 year, month, date, hourOfDay, minute, second
calendar = Calendar.getInstance();
calendar.set(2013, 1, 2, 17, 35, 44);
str = (new SimpleDateFormat("yyyy-MM-dd HH:mm:ss:SSS")).format(calendar.getTime());
System.out.println(str); // Calendar 取得当前时间的方法
// 初始化 (重置) Calendar 对象
calendar = Calendar.getInstance();
// 或者用 Date 来初始化 Calendar 对象
calendar.setTime(new Date()); // setTime 类似上面一行
// Date date = new Date();
// calendar.setTime(date); str = (new SimpleDateFormat("yyyy-MM-dd HH:mm:ss:SSS")).format(calendar.getTime());
System.out.println(str); // 显示年份
int year = calendar.get(Calendar.YEAR);
System.out.println("year is = " + String.valueOf(year)); // 显示月份 (从0开始, 实际显示要加一)
int month = calendar.get(Calendar.MONTH);
System.out.println("nth is = " + (month + 1)); // 本周几
int week = calendar.get(Calendar.DAY_OF_WEEK);
System.out.println("week is = " + week); // 今年的第 N 天
int DAY_OF_YEAR = calendar.get(Calendar.DAY_OF_YEAR);
System.out.println("DAY_OF_YEAR is = " + DAY_OF_YEAR); // 本月第 N 天
int DAY_OF_MONTH = calendar.get(Calendar.DAY_OF_MONTH);
System.out.println("DAY_OF_MONTH = " + String.valueOf(DAY_OF_MONTH)); // 3小时以后,Calendar.HOUR_OF_DAY是24小时制Calendar.HOUR是12小时制
    calendar.add(Calendar.HOUR_OF_DAY, 3);
int HOUR_OF_DAY = calendar.get(Calendar.HOUR_OF_DAY);
System.out.println("HOUR_OF_DAY + 3 = " + HOUR_OF_DAY); // 当前分钟数
int MINUTE = calendar.get(Calendar.MINUTE);
System.out.println("MINUTE = " + MINUTE); // 15 分钟以后
calendar.add(Calendar.MINUTE, 15);
MINUTE = calendar.get(Calendar.MINUTE);
System.out.println("MINUTE + 15 = " + MINUTE); // 30分钟前
calendar.add(Calendar.MINUTE, -30);
MINUTE = calendar.get(Calendar.MINUTE);
System.out.println("MINUTE - 30 = " + MINUTE); // 格式化显示
str = (new SimpleDateFormat("yyyy-MM-dd HH:mm:ss:SS")).format(calendar.getTime());
System.out.println(str); // 重置 Calendar 显示当前时间
calendar.setTime(new Date());
str = (new SimpleDateFormat("yyyy-MM-dd HH:mm:ss:SS")).format(calendar.getTime());
System.out.println(str); // 创建一个 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));
}
}

运行结果

2013-06-07 23:27:34:195
2013-06-01 13:24:16:000
2013-02-02 17:35:44:197
2013-06-07 23:27:34:197
year is = 2013
nth is = 6
week is = 6
DAY_OF_YEAR is = 158
DAY_OF_MONTH = 7
HOUR_OF_DAY + 3 = 2
MINUTE = 27
MINUTE + 15 = 42
MINUTE - 30 = 12
2013-06-08 02:12:34:197
2013-06-07 23:27:34:199
时间比较:-1
时间比较:1
时间比较:0

要计算时间差,可用 Calendar.getTimeInMillis() 取得两个时间的微秒级的时间差,再加以换算即可,比如获得相差天数,代码如下:

    // 得微秒级时间差
long val = calendarEnd.getTimeInMillis() - calendarBegin.getTimeInMillis();
// 换算后得到天数
long day = val / (1000 * 60 * 60 * 24);

其他与 date 相关的类型转换代码如下。

Timestamp 类型转换为 Date 类型:

Timestamp stamp = new Timestamp(System.currentTimeMillis());
Date date = new Date(stamp.getTime());
System.out.println(date);

Timestamp 类型转换为 Calendar 类型:

// 获取 Timestamp 类型时间
Timestamp timestamp = new Timestamp(System.currentTimeMillis()); // 转换为 Calendar 类型,SUN 也推荐用 Calendar 处理时间信息
Calendar calendar = Calendar.getInstance();
calendar.setTimeInMillis(timestamp.getTime());

Date 类型转换为 Calendar 类型

// Date 向 Calendar 赋值
calendar.setTime(date);

Calendar 类型转换为 Timestamp 类型:

// 创建 Calendar 对象,也同时获取了当前时间
Calendar calendar = Calendar.getInstance(); // 转换为 Timestamp 类型对象
Timestamp timestamp = new Timestamp(calendar.getTimeInMillis());
System.out.println(timestamp);

Calendar 类型转换为 Date 类型:

// Calendar 对象类型转换为 Date 对象类型
Calendar calendar = Calendar.getInstance();
java.util.Date date = calendar.getTime();
System.out.println(date);

add() 与 roll() 的区别

add() 的功能非常强大,add 可以对 Calendar 的字段进行计算。如果需要减去值,那么使用负数值就可以了,如 add(field, -value)。
add() 有两条规则:
当被修改的字段超出它可以的范围时,那么比它大的字段会自动修正。如:Calendar cal1 = Calendar.getInstance();cal1.set(2000, 7, 31, 0, 0 , 0); //2000-8-31cal1.add(Calendar.MONTH, 1); //2000-9-31 => 2000-10-1,对吗?System.out.println(cal1.getTime()); //结果是 2000-9-30
另一个规则是,如果比它小的字段是不可变的(由 Calendar 的实现类决定),那么该小字段会修正到变化最小的值。
以上面的例子,9-31 就会变成 9-30,因为变化最小。
Roll() 的规则只有一条:当被修改的字段超出它可以的范围时,那么比它大的字段不会被修正。如:
Calendar cal1 = Calendar.getInstance();cal1.set(1999, 5, 6, 0, 0, 0); //1999-6-6, 周日cal1.roll(Calendar.WEEK_OF_MONTH, -1); //1999-6-1, 周二cal1.set(1999, 5, 6, 0, 0, 0); //1999-6-6, 周日cal1.add(Calendar.WEEK_OF_MONTH, -1); //1999-5-30, 周日WEEK_OF_MONTH 比 MONTH 字段小,所以 roll 不能修正 MONTH 字段。

roll()函数处理,只会比相应的字段进行处理,不会智能的对其它字段也进行逻辑上的改变。但是add()函数会在逻辑上改变其它字段,使结果正确。

 java取得当前日期增加一天或多天

 

代码如下:

Calendar 日历类的时间操作
SimpleDateFormat sf = new SimpleDateFormat("yyyy-MM-dd");
Calendar c = Calendar.getInstance();
System.out.println("当前日期:"+sf.format(c.getTime()));
c.add(Calendar.DAY_OF_MONTH, 1);
System.out.println("增加一天后日期:"+sf.format(c.getTime()));
//打印结果
//当前日期: 2013-06-18
//增加一天后日期 : 2013-06-19
Calendar 日历类的时间操作

Java Calendar获取年、月、日、时间

Calendar 日历类的时间操作
 Calendar c = Calendar.getInstance(TimeZone.getTimeZone("GMT+08:00"));    //获取东八区时间

int year = c.get(Calendar.YEAR);    //获取年
int month = c.get(Calendar.MONTH) + 1; //获取月份,0表示1月份
int day = c.get(Calendar.DAY_OF_MONTH); //获取当前天数
int first = c.getActualMinimum(c.DAY_OF_MONTH); //获取本月最小天数
int last = c.getActualMaximum(c.DAY_OF_MONTH); //获取本月最大天数
int time = c.get(Calendar.HOUR_OF_DAY); //获取当前小时
int min = c.get(Calendar.MINUTE); //获取当前分钟
int xx = c.get(Calendar.SECOND); //获取当前秒 SimpleDateFormat s=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
String curDate = s.format(c.getTime()); //当前日期
System.out.println("当前时间:"+year + "-" + month + "-"+ day + " "+time + ":" + min +":" + xx);
System.out.println("第一天和最后天:" + first +"," + last);
System.out.println("当前日期curDate====:" + curDate);
Calendar 日历类的时间操作

输出结果:

当前时间:2012-9-25 22:50:54 第一天和最后天:1,30

当前日期curDate:2012-09-25 22:50:54

Calendar的计算

Calendar 日历类的时间操作
c.add(Calendar.YEAR, 1);
c.add(Calendar.MONTH, 1);
c.add(Calendar.DAY_OF_MONTH, 1);
int year2 = c.get(Calendar.YEAR);
int month2 = c.get(Calendar.MONTH) + 1;
int day2 = c.get(Calendar.DAY_OF_MONTH);
int firstD = c.getActualMinimum(c.DAY_OF_MONTH);
int lastD = c.getActualMaximum(c.DAY_OF_MONTH);
System.out.println("当前时间:"+year2 + "-" + month2 + "-"+ day2 + " "+time + ":" + min +":" + xx);
System.out.println("第一天和最后天:" + firstD +"," + lastD);
Calendar 日历类的时间操作

输出结果:

当前时间:2013-10-26 23:4:3 第一天和最后天:1,31

获取上个月的年、月、日

Calendar 日历类的时间操作
Calendar c=Calendar.getInstance();
c.add(Calendar.MONTH, -1);//上个月
SimpleDateFormat s=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
String year=String.valueOf(c.get(Calendar.YEAR));
String topDay = String.valueOf(c.getActualMinimum(Calendar.DAY_OF_MONTH));
String lastDay = String.valueOf(c.getActualMaximum(Calendar.DAY_OF_MONTH)); //上个月
String lastMonth=String.valueOf(c.get(Calendar.MONTH)+1).length()==2?String.valueOf(c.get(Calendar.MONTH)+1):"0"+String.valueOf(c.get(Calendar.MONTH)+1);
String topDayMonth=year+"-"+lastMonth+"-"+"01" + " 00:00:00";
String lastDayMonth = year+"-"+lastMonth+"-"+lastDay+ " 23:59:59";
System.out.println("###year:" + year);
System.out.println("###last month:" + lastMonth);
System.out.println("###topday:" + topDayMonth);
System.out.println("###lastday:" + lastDayMonth);
Calendar 日历类的时间操作

输出结果

###year:2013

###last month:04

###topday:2013-04-01 00:00:00

###lastday:2013-04-30 23:59:59

转自 http://hi.baidu.com/zzm_2007/item/3b967b1cd1586e4e2b3e2258

https://blog.csdn.net/joyous/article/details/9630893

https://www.cnblogs.com/huangminwen/p/6041168.html

Calendar 日历类的时间操作的更多相关文章

  1. Java Calendar 类的时间操作

    Java Calendar 类的时间操作 标签: javaCalendar时间Date 2013-07-30 17:53 140401人阅读 评论(7) 收藏 举报 分类: 所有(165) Java ...

  2. 常用类--Date日期类,SimpleDateFormat日期格式类,Calendar日历类,Math数学工具类,Random随机数类

    Date日期类 Date表示特定的时间,精确到毫秒; 构造方法: public Data() public Date(long date) 常用方法: public long getTime() pu ...

  3. Calendar日历类

    package com.yhqtv.demo02.ThreadPool; import java.util.Calendar; import java.util.Date; /* * java.uti ...

  4. Java Calendar 类的时间操作&period;RP

    JavaCalendar 类时间操作,这也许是创建和管理日历最简单的一个方案,示范代码很简单. 演示了获取时间,日期时间的累加和累减,以及比较. 原文地址:blog.csdn.NET/joyous/a ...

  5. java Calendar日历类

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

  6. Date日期类 Calendar日历类 完成可视化日历

    package com.test; import java.text.DateFormat; import java.text.ParseException; import java.text.Sim ...

  7. Java Calendar日历类的使用

    Calendar cal = Calendar.getInstance(); // 当前年 int year = cal.get(Calendar.YEAR); // 当前月 int month = ...

  8. java学习笔记之日期日历类

    java学习笔记之日期日历 Date日期类概述: 表示特定的瞬间,精确到毫秒 Date类的构造方法: 1.空参数构造方法 Date date = new Date(); 获取到当前操作系统中的时间和日 ...

  9. Java常用类之时间类

    JDK8之前日期时间API 1. java.lang.System类 2. java.util.Date类 3. java.text.SimpleDateFormat类 4. java.util.Ca ...

随机推荐

  1. PowerDesigner自增列问题

  2. &lbrack;转&rsqb; sql&lowbar;id VS hash&lowbar;value

    有没有发现,v$session,v$sql,v$sqlarea,v$sqltext,v$sql_shared_cursor等试图连接的时候经常会用到hash_value,sql_id,但是他们2个之间 ...

  3. spserver 开源服务器框架研究与分析

    网上开源的C/C++服务器框架 还是比较少的. 最近研究了 spserver , 里面用了较多的设计模式,使用设计模式的目的是把不变的东西和可变的东西分离并且封装起来,避免以后修改代码, 应用设计模式 ...

  4. &colon;after和&colon;before中的content(放入icon)

    作者:zccst 最近见到一种图标写在content里的用法,觉得很新奇.查了一下是webfont. 问题:以下是我看到的一段css的源代码,其实就是在分享到为微博的时候的图标 a#end_cc, a ...

  5. Android 里的adb命令

    ADB的全称为Android Debug Bridge,就是起到调试桥的作用. adb调试手机需要把usb调试打开 Android studio模拟器有的也要把模拟器usb调试打开,工具要灵活运用, ...

  6. Loj 【CQOI 2006】简单题,mmp

    #10117. 「一本通 4.1 练习 2」简单题     题目描述 题目来源:CQOI 2006 有一个 nnn 个元素的数组,每个元素初始均为 000.有 mmm 条指令,要么让其中一段连续序列数 ...

  7. Linux 安装python3&period;7&period;0

    我这里使用的时centos7-mini,centos系统本身默认安装有python2.x,版本x根据不同版本系统有所不同,可通过 python --V 或 python --version 查看系统自 ...

  8. diff命令的参数详解和实例 【转】

    转自:http://blog.chinaunix.net/uid-25324849-id-270254.html diff命令参数: diff - 找出两个文件的不同点 总览 diff [选项] 源文 ...

  9. 桂电第一次程序设计 C STL 排序

    Problem 1197 # 共享厕所 ediszhao添加于2017-12-22 15:00:56 时间限制 : 1000MS 内存限制 : 65536KB ×提示 : 你已解决此题目. 问题描述 ...

  10. C&num;使用System&period;IO&period;Path获取文件路径、文件名

    class Program { static void Main(string[] args) { //获取当前运行程序的目录 string fileDir = Environment.Current ...