欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Java对时间日期的加减

程序员文章站 2022-05-02 15:55:20
...

 

最近在开发中遇到时间日期上面的一些处理,查询了一些资料,下面列出两种最常用的处理方式

Java提供了3个日期类,Date,Calendar,DateFormat,Date对象主要用于创建日期,获取日期,Calendar可用于获取和设置日期,DataFormat主要用于对日期进行格式化。

1.java.util.Calendar 
Calendar 类是一个抽象类,它为特定瞬间与一组诸如 YEAR、MONTH、DAY_OF_MONTH、HOUR 等 日历字段之间的转换提供了一些方法,并为操作日历字段(例如获得下星期的日期)提供了一些方法。瞬间可用毫秒值来表示,它是距历元(即标准时间 1970 年 1 月 1 日的 00:00:00.000,格里高利历)的偏移量。 
例: 

Calendar cal = Calendar.getInstance();//使用默认时区和语言环境获得一个日历。   
cal.add(Calendar.DAY_OF_MONTH, -1);//取当前日期的前一天.   
  
cal.add(Calendar.DAY_OF_MONTH, +1);//取当前日期的后一天.   
  
//通过格式化输出日期   
java.text.SimpleDateFormat format = new java.text.SimpleDateFormat("yyyy-MM-dd");   
  
System.out.println("Today is:"+format.format(Calendar.getInstance().getTime()));   
  
System.out.println("yesterday is:"+format.format(cal.getTime())); 

 要用Calendar对象得到2014-9-25日期,方法如下:

Calendar calendar = new GregorianCalendar(2014, 8, 25,0,0,0);   
Date date = calendar.getTime();   
System.out.println("Now's the time:"+format.format(date));   

  java月份是从0-11,月份设置时要减1.

GregorianCalendar构造方法参数依次为:年,月-1,日,时,分,秒. 
有些时候我们需要根据时间去取相关年月日的值,Calender提供了方法:

 

int year =calendar.get(Calendar.YEAR);   
 //月份是0-11,所以要加上1
int month=calendar.get(Calendar.MONTH)+1;   
  
int day =calendar.get(Calendar.DAY_OF_MONTH);   
  
int hour =calendar.get(Calendar.HOUR_OF_DAY);   
  
int minute =calendar.get(Calendar.MINUTE);   
  
int seconds =calendar.get(Calendar.SECOND); 

 判断月份最大值,在刚开始对Java不熟悉的时候我获取最大值用了多个判断,但java提供了获取月份最大值得方法

Calendar cal = Calendar.getInstance();   
int day=cal.getActualMaximum(Calendar.DAY_OF_MONTH);   
System.out.println(day);   

 2.java.util.Date 

 

Date类实际上只是一个包裹类, 它包含的是一个长整型数据, 表示的是从GMT(格林尼治标准时间)1970年, 1月1日00:00:00这一刻之前或者是之后经历的毫秒数。

 

获取当前时间:

java.util.Date today=new java.util.Date();   
System.out.println("Today is "+formats.format(today));   

 获取当月的第一天:

java.text.SimpleDateFormat format = new java.text.SimpleDateFormat("yyyy-MM-01");   
java.util.Date firstDay=new java.util.Date();   
System.out.println("the month first day is "+formats.format(firstDay)); 
 

 获取当月的最后一天:

Calendar cal = Calendar.getInstance();   
int maxDay=cals.getActualMaximum(Calendar.DAY_OF_MONTH);   
java.text.Format formatter3=new java.text.SimpleDateFormat("yyyy-MM-"+maxDay);   
System.out.println(formatter3.format(cal.getTime()));   

 求两个日期之间相隔的天数: 

 

java.text.SimpleDateFormat format = new java.text.SimpleDateFormat("yyyy-MM-dd");   
java.util.Date beginDate= format.parse("2007-12-24");   
java.util.Date endDate= format.parse("2007-12-25");  
//相隔毫秒数转化为天数 
long day=(date.getTime()-mydate.getTime())/(24*60*60*1000);   
System.out.println("相隔的天数="+day);   

 一年前的日期: 

java.text.Format formatter=new java.text.SimpleDateFormat("yyyy-MM-dd");   
java.util.Date todayDate=new java.util.Date();   
//一年后的则这里加上365天
long beforeTime=(todayDate.getTime()/1000)-60*60*24*365;   
todayDate.setTime(beforeTime*1000);   
String beforeDate=formatter.format(todayDate);   
System.out.println(beforeDate);  

 10小时后的时间:

java.util.Calendar Cal=java.util.Calendar.getInstance();   
Cal.setTime(dateOper);   
//10小时前的则-10
Cal.add(java.util.Calendar.HOUR_OF_DAY,10);   
System.out.println("date:"+forma.format(Cal.getTime()));  

 3 java.text.DateFormat

SimpleDateFormat 是一个以国别敏感的方式格式化和分析数据的具体类。 它允许格式化 (date -> text)、语法分析 (text -> date)和标准化。

SimpleDateFormat 允许以为日期-时间格式化选择任何用户指定的方式启动。 但是,希望用 DateFormat 中的getTimeInstance、 getDateInstance 或 getDateTimeInstance 创建一个日期-时间格式化程序。 每个类方法返回一个以缺省格式化方式初始化的日期/时间格式化程序。

下面是一个小例子:

import java.text.*;
import java.util.Date;

/**
  SimpleDateFormat函数语法:
  
  G 年代标志符
  y 年
  M 月
  d 日
  h 时 在上午或下午 (1~12)
  H 时 在一天中 (0~23)
  m 分
  s 秒
  S 毫秒
  E 星期
  D 一年中的第几天
  F 一月中第几个星期几
  w 一年中第几个星期
  W 一月中第几个星期
  a 上午 / 下午 标记符 
  k 时 在一天中 (1~24)
  K 时 在上午或下午 (0~11)
  z 时区
 */
public class FormatDateTime {

    public static void main(String[] args) {
        SimpleDateFormat myFmt=new SimpleDateFormat("yyyy年MM月dd日 HH时mm分ss秒");
        SimpleDateFormat myFmt1=new SimpleDateFormat("yy/MM/dd HH:mm"); 
        SimpleDateFormat myFmt2=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");//等价于now.toLocaleString()
        SimpleDateFormat myFmt3=new SimpleDateFormat("yyyy年MM月dd日 HH时mm分ss秒 E ");
        SimpleDateFormat myFmt4=new SimpleDateFormat(
                "一年中的第 D 天 一年中第w个星期 一月中第W个星期 在一天中k时 z时区");
        Date now=new Date();
        System.out.println(myFmt.format(now));
        System.out.println(myFmt1.format(now));
        System.out.println(myFmt2.format(now));
        System.out.println(myFmt3.format(now));
        System.out.println(myFmt4.format(now));
        System.out.println(now.toGMTString());
        System.out.println(now.toLocaleString());
        System.out.println(now.toString());
    }    
    
}

 效果:

2014-09-25 10:55:33

2014年09月25日 10时55分33秒 星期四 

一年中的第 268 天 一年中第39个星期 一月中第4个星期 在一天中10时 CST时区

25 Sep 2014 02:55:33 GMT

2014-9-25 10:55:33

Thu Sep 25 10:55:33 CST 2014