java calendar 设置小时_Calendar 日历类的时间操作

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

public abstract class Calendar extends Objectimplements Serializable, Cloneable, Comparable

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

Calendar rightNow = Calendar.getInstance();

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

8f900a89c6347c561fdf2122f13be562.png

961ddebeb323a10fe0623af514929fc1.png

/*** Gets a calendar using the default time zone and locale. The

* Calendar returned is based on the current time

* in the default time zone with the default locale.

*

*@returna Calendar.*/

public staticCalendar getInstance()

{

Calendar cal=createCalendar(TimeZone.getDefaultRef(), Locale.getDefault(Locale.Category.FORMAT));

cal.sharedZone= true;returncal;

}

View Code

注意事项:

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 演示代码如下:

packagedemo;importjava.util.Date;importjava.text.SimpleDateFormat;importjava.text.DateFormat;importjava.text.ParseException;importjava.util.Calendar;public classTest

{publicTest()

{

}public static voidmain(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(newDate());

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(newDate());//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(newDate());

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:197year is= 2013nth is= 6week is= 6DAY_OF_YEAR is= 158DAY_OF_MONTH= 7HOUR_OF_DAY+ 3 = 2MINUTE= 27MINUTE+ 15 = 42MINUTE- 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 = newTimestamp(System.currentTimeMillis());

Date date= newDate(stamp.getTime());

System.out.println(date);

Timestamp 类型转换为 Calendar 类型:

//获取 Timestamp 类型时间

Timestamp timestamp = newTimestamp(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 = newTimestamp(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()函数会在逻辑上改变其它字段,使结果正确。

代码如下:

48304ba5e6f9fe08f3fa1abda7d326ab.png

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

48304ba5e6f9fe08f3fa1abda7d326ab.png

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

48304ba5e6f9fe08f3fa1abda7d326ab.png

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);

48304ba5e6f9fe08f3fa1abda7d326ab.png

输出结果:

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

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

Calendar的计算

48304ba5e6f9fe08f3fa1abda7d326ab.png

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);

48304ba5e6f9fe08f3fa1abda7d326ab.png

输出结果:

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

获取上个月的年、月、日

48304ba5e6f9fe08f3fa1abda7d326ab.png

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);

48304ba5e6f9fe08f3fa1abda7d326ab.png

输出结果

###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

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值