在之前的文章我们介绍了一下 Java 中的包装类,本章我们来看一下 Java 中的日期操作。
在我们日常编程中,日期使我们非常常用的一个操作,比如读写日期,输出日志等,那接下来我们就看一下 Java 中的日期操作。
 从上图可以看出 Java 为我们提供了三个标准类库来工我们使用,三个类库之间在使用过程中又需要相互协作,接下来我们就一一看一下。
Java中的时间
  1、Java 中的时间使用标准类库的 Date 类表示,是用距离一个固定时间点的毫秒数(可正可负,long 类型)表示一个特定的时间点;
  2、固定的时间点叫纪元(epoch),是 UTC 时间 1970年1月1日 00:00:00;
  3、UTC(Universal Time Coordinated 世界调整时间)与GMT(Greenwich Mean Time 
格林威治时间)一样,是一种具有实际目的的科学标准时间。
 1 import java.util.Date;  2  3 /**  4  * java.util.Date 包  5  * Date 
的每一个实例用于表示一个确切的时间点。 6  * 内部维护了一个 long 值,该值记录的是从:  7  * 1970年1月1日 00:00:00 
到表示的时间点之间所经历的毫秒值。 8  * 正数是 70 年以后的日期,负数是 70 年以前的日期  9  * 由于 Date 
设计上存在缺陷(时区,千年虫),所以它的大部分方法被设置为"过时的",10  * 不再建议使用 11 */ 12 public class Main { 13 
public static void main(String[] args) { 14 // 当前系统时间 15 Date now = new Date(); 
16 System.out.println(now); // Wed Dec 11 15:57:21 CST 2019 --对非英语地区很不友好 17 18 
/** 19  * Date 的大部分方法不建议使用了 20  * */ 21 now.getYear(); // getYear 
上面油条横线,表示方法已不再建议使用 22 /** 23  * 获取 Date 内部维护的 long 还可以使用 24  * */ 25 long time =
 now.getTime();26 System.out.println(time); // 1576053403721 27 /** 28  * void 
setTime(long)29  * 设置一个 long 值,使 Date 表示该 long 值所表示的时间 30  * */ 31 time += 24 * 
60 * 60 * 1000;// 将 time 加 1 天的毫秒,即明天 32 now.setTime(time); // setTime() 
可以将时间设置为我们规定的时间 33 System.out.println(now); // Thu Dec 12 16:39:54 CST 2019 34 
35  } 36 } 
在上面的代码中,我们讲解了一些关于 Date 的一些内容,可以看出 Date 已经不是很实用现在的编程,我们充其量也只是用一下 getTime 
这个方法。下面我们来看一下 SimpleDateFormat
SimpleDateFormat 可以根据一个给定的日期格式将 String 和 Date 想换转换,格式如下:
现在我们就根据上面的转换格式输出一下当前时间,代码如下:
 1 import java.text.ParseException;  2 import java.text.SimpleDateFormat;  3 
import java.util.Date;  4  5 /**  6  * java.util.SimpleDateFormat 包  7  * 
根据一个给定的日期格式将 String 与 Date 相互转换 8 */  9 public class Main { 10 public static 
void main(String[] args) throws ParseException { 11 // 当前系统时间 12 Date now = new 
Date();13 System.out.println(now); // Wed Dec 11 16:50:42 CST 2019 14 15 
SimpleDateFormat sdf =new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); 16 17 /** 18 
 * 将 String 转为 Date19  * String format(Date date) 20  * format 方法可以将给定的 date 
对象所表示的时间21  * 按照 SimpleDateFormat 制定的日期格式转换为字符串 22 */ 23 String str = 
sdf.format(now);24 System.out.println(str); // 2019-12-12 11:10:53 25 26 /** 27 
 * 将 Date 转为 String28  * Date parse(String str) 29  * parse 方法可以将给定的 str 按照 
SimpleDateFormat 制定的30  * 日期格式解析为一个 Date 对象 31 */ 32 Date date = sdf.parse(str);
33 System.out.println(date); // Thu Dec 12 11:47:09 CST 2019 34  } 35 } 
在上面的代码中,我们实现了 Date 与 String 之间的互转,需要注意的是在使用 parse 
方法时需要先抛出异常,这个我们在之后的内容中会详细讲解异常的处理。
接下来我们再来看一下时间操作中的 Calender,
 
 1 import java.util.Calendar;  2 import java.util.Date;  3  4 /**  5  * 
java.util.Calender 包 6  * 日历类  7  * 该类事一个抽象类,封装了对时间的相关操作  8  * 常用的实现类格力高里历(阳历)  
9  * 使用日历类是为了对时间进行相关的操作 10  * 比如计算时间 11 */ 12 public class Main { 13 public 
static void main(String[] args) { 14 /** 15  * 使用 Calender 的静态方法创建实例, 16  * 
该方法会根据当前系统所在时区创建一个相应的实现17  * 通常是 GregorianCalender 18  * 默认创建的日历实例表示当前系统时间 19  *
*/ 20 Calendar calendar = Calendar.getInstance(); 21 // toString 不能直观反映表示的日期 22 
System.out.println(calendar);// 
java.util.GregorianCalendar[time=1576134924891,areFieldsSet=true,areAllFieldsSet=true,lenient=true,zone=sun.util.calendar.ZoneInfo[id="Asia/Shanghai",offset=28800000,dstSavings=0,useDaylight=false,transitions=19,lastRule=null],firstDayOfWeek=1,minimalDaysInFirstWeek=1,ERA=1,YEAR=2019,MONTH=11,WEEK_OF_YEAR=50,WEEK_OF_MONTH=2,DAY_OF_MONTH=12,DAY_OF_YEAR=346,DAY_OF_WEEK=5,DAY_OF_WEEK_IN_MONTH=2,AM_PM=1,HOUR=3,HOUR_OF_DAY=15,MINUTE=15,SECOND=24,MILLISECOND=891,ZONE_OFFSET=28800000,DST_OFFSET=0]
23 24 /** 25  * Calender 与 Date 之间的互转 26  * Calender -> Date 27  * Date 
getTime()28  * Calender 提供了方法 getTime() 29  * 该方法返回一个 Date 对象,该对象表示的时间就是 30  * 
当前 Calender 表示的时间31 */ 32 Date date = calendar.getTime(); 33 
System.out.println(date);// Thu Dec 12 15:18:56 CST 2019 34 35 /** 36  * Date 
-> Calender37  * Void setTime(Date date) 38  * Calender 的 setTime 方法可以使当前 39  * 
Calender 表示给定的 Date 所表示的时间40 */ 41  calendar.setTime(date); 42  } 43 } 
当然 Calender 提供了针对不同时间分量单独设置的值,如下:
 1 import java.util.Calendar;  2  3 /**  4  * Calender 提供了针对不同时间分量单独设置值的方法  5  
* void set(int filed, int value) 6  * 其中第一个参数为:时间分量,例如:年,月,日等等  7  * 第二个参数为对应的值 
 8  * 时间分量是一个 int 值,使用 Calender 提供的常量  9 */ 10 public class Main { 11 public 
static void main(String[] args) { 12 Calendar calendar = Calendar.getInstance();
13 System.out.println(calendar.getTime()); // Thu Dec 12 16:33:06 CST 2019 14 15
// 设置 Calender,使其表示 2008-08-08 20:08:08 16 // 设定年 17 
calendar.set(Calendar.YEAR, 2008); 18 System.out.println(calendar.getTime()); //
 Fri Dec 12 16:33:06 CST 200819 20 // 设置月 21 calendar.set(Calendar.MONTH, 7); //
 月是从 0 开始的 22 calendar.set(Calendar.MONTH, Calendar.AUGUST); // 也可以使用常量表示月 23 
System.out.println(calendar.getTime());// Tue Aug 12 16:50:43 CST 2008 24 25 /**
26  * 设置日 27  * 对应的时间分量常用的 28  * DATE:月中天 29  * DAY_OF_MONTH:月中的天,与DATE一致 30  * 
DAY_OF_WEEK:周中的天,星期几31  * DAY_OF_YEAR:年中的天 32  * */ 33 
calendar.set(Calendar.DATE, 8); 34 System.out.println(calendar.getTime()); // 
Fri Aug 08 17:01:48 CST 200835 36 // 设置小时 37 calendar.set(Calendar.HOUR, 8); 38 
System.out.println(calendar.getTime());// Fri Aug 08 08:35:45 CST 2008 39 40 // 
设置分 41 calendar.set(Calendar.MINUTE, 8); 42 
System.out.println(calendar.getTime());// Fri Aug 08 08:08:45 CST 2008 43 44 // 
设置秒 45 calendar.set(Calendar.SECOND, 8); 46 
System.out.println(calendar.getTime());// Fri Aug 08 08:08:08 CST 2008 47  } 48 
} 
在上面的代码中,我们可以根据 set 方法来设定任意我们想要的时间分量。
当然,我们既可以单独设置时间分量,也可以单独获取时间分量,如下:
 1 import java.util.Calendar;  2  3 /**  4  * 获取一个 Calender 表示的日期中  5  * 
各个时间分量对应的值 6  * int get(int filed)  7  * 获取对应时间分量的值  8 */  9 public class Main {
10 public static void main(String[] args) { 11 Calendar calendar = 
Calendar.getInstance();12 13 // 获取年 14 int year = calendar.get(Calendar.YEAR); 
15 System.out.println(year); // 2019 16 17 // 获取月 18 int month = 
calendar.get(Calendar.MONTH) + 1;// 月是从 0 开始 19 System.out.println(month); // 12
20 21 // 获取周 22 int week = calendar.get(Calendar.DAY_OF_WEEK) - 1; // 周是从周日开始的 
23 System.out.println(week == 0 ? 7 : week); // 5 24 String[] data = 
{"日","一","二","三","四","五","六"}; 25 System.out.println(data[week]); // 五 26 27 // 
获取日 28 int date = calendar.get(Calendar.DATE); 29 System.out.println(date); // 
13 30  } 31 } 
接下来我们再来看一下 Calender 中的时间计算:
 1 import java.util.Calendar;  2  3 /**  4  * Calender 中计算时间的方法  5  * void 
add(int field, int value) 6  * 对指定的时间分量加上给定的值,若给定的值是负数  7  * 则是减去给定的值  8 */  9 
public class Main { 10 public static void main(String[] args) { 11 Calendar 
calendar = Calendar.getInstance(); 12 // 查看3年2月1天后的日期 13 14 // 查看 3 年后 15 
calendar.add(Calendar.YEAR, 3); 16 System.out.println(calendar.getTime()); // 
Tue Dec 13 10:59:29 CST 202217 18 // 查看 2 月后 19 calendar.add(Calendar.MONTH, 2);
20 System.out.println(calendar.getTime()); // Mon Feb 13 10:59:29 CST 2023 21 22
// 查看 1 天后 23 calendar.add(Calendar.DAY_OF_YEAR, 1); 24 
System.out.println(calendar.getTime());// Tue Feb 14 10:59:29 CST 2023 25  } 26 
} 
热门工具 换一换