一、日期相关常用类

    

 

二、获取时间戳

  System 类提供的 public static long currentTimeMillis() 用来返回当前时间与 1970 年1月1日0时0分0秒之间以毫秒为单位的时间差。

public static long currentTimeMillis():此方法适于计算时间差

    扩展:计算世界时间的主要标准有:

UTC:Coordinated Universal Time

GMT:Greenwich Mean Time

CST:Central Standard Time

    Demo:

1     @Test
2     public void test1() {
3         long time = System.currentTimeMillis();
4         //返回当前时间与1970年1月1日0时0分0秒之间以毫秒为单位的时间差。
5         //称为时间戳
6         System.out.println(time);  //1615643417487
7     }

 

三、Date类

  1、java.util.Date 类

    java.util.Date 表示特定的瞬间,精确到毫秒;

    (1)构造器

Date(): 使用无参构造器创建的对象可以获取本地当前时间;
Date(long date):创建指定毫秒数的 Date 对象,以表示自从标准基准时间(称为“历元(epoch)”,即1970年1月1日00:00:00 GMT)以来的指定毫秒数。

 

    (2)常用方法

getTime():返回自 1970 年 1 月 1 日 00:00:00 GMT 以来此 Date 对象表示的毫秒数;
toString():把此 Date 对象转换为以下形式的 String: dow mon dd hh:mm:ss zzz yyyy 其中: dow 是一周中的某一天 (Sun, Mon, Tue,Wed, Thu, Fri, Sat), zzz是时间标准

 

    Demo:

 1     @Test
 2     public void test2() {
 3         Date date = new Date();   //创建一个对应当前时间的 Date 对象
 4         System.out.println(date.getTime());  //1615644029188
 5         System.out.println(date.toString()); //Sat Mar 13 22:00:29 CST 2021
 6 
 7 
 8         Date date1 = new Date(161564402000L);  //创建指定毫秒数的 Date 对象
 9         System.out.println(date1.getTime());  //161564402000
10         System.out.println(date1.toString()); //Fri Feb 14 07:00:02 CST 1975
11     }

 

  2、java.sql.Date 类

    java.sql.Date 类是 java.util.Date 类的子类,一般用于与数据库中记录的日期时间相匹配。

    (1)构造器

Date(int year, int month, int day): 使用year,month,day创建Date 对象,这里的year是与1900年的偏移量,月份从1开始累加
Date(long date):创建指定毫秒数的 Date 对象

    (2)常用方法

getTime():获取当前Date对象对应的毫秒数。(时间戳)
toString():显示当前的年、月、日、时、分、秒

 

    Demo:

 1     @Test
 2     public void test3() {
 3         java.sql.Date date = new java.sql.Date(0, 03, 13);
 4         System.out.println(date.getTime());  //-2200205143000
 5         System.out.println(date.toString()); //1900-04-13
 6 
 7 
 8         java.sql.Date date1 = new java.sql.Date(161564402000L);
 9         System.out.println(date1.getTime());  //161564402000
10         System.out.println(date1.toString()); //1975-02-14
11     }

 

  3、思考

    (1)如何将java.util.Date对象转换为java.sql.Date对象

//情况一:强转
Date date = new java.sql.Date(2343243242323L);
java.sql.Date date2 = (java.sql.Date) date;

//情况二:利用子类的构造器
Date date3 = new Date();
java.sql.Date date4 = new java.sql.Date(date3.getTime());

 

    (2)如何将java.sql.Date对象转换为java.util.Date对象

      利用多态的性质,可以将子类对象赋值给父类引用

Date date = new java.sql.Date(2343243242323L);

 

四、SimpleDateFormat 类

  1、概述

    Date 类的 API 不易于国际化,大部分被废弃了,java.text.SimpleDateFormat 类是一个不与语言环境有关的方式来格式化和解析日期的具体类。

    java.text.DateFormat 是日期/时间格式化子类的抽象类,通过这个类可以帮助我们完成日期和文本之间的转换,即Date对象与String对象之间转换。

 

    •  格式化:按照指定的格式,从 Date 对象转换为 String 对象;
    •  解析:按照指定的格式,从String 对象转换到 Date 对象。

    由于 DateFormat 为抽象类,不能直接使用,所以需要使用它的子类 java.text.SimpleDateFromat。

 

    SimpleDateFormat 类它允许进行格式化:日期——>文本; 解析:文本——>日期;

    SimpleDateFormat对日期Date类的格式化和解析。

  2、构造器

SimpleDateFormat format = new SimpleDateFormat(); //默认的模式和语言环境创建对象
SimpleDateFormat format1 = new SimpleDateFormat(String pattern); //该构造方法可以用参数 pattern指定的格式创建一个对象,该对象调用

   说明:

            

  3、格式化

public String format(Date date): 方法格式化时间对象date,转化为 String

  4、解析

public Date parse(String source): 从给定字符串的开始解析文本,以生成一个日期。

  5、案例

 1     @Test
 2     public void test4() throws ParseException {
 3         //实例化SimpleDateFormat:使用默认的构造器
 4         SimpleDateFormat format = new SimpleDateFormat();
 5 
 6         Date date = new Date();
 7         System.out.println("date = " + date);  //Sat Mar 13 22:33:14 CST 2021
 8 
 9         //格式化:日期——>字符串
10         String dateStr = format.format(date);
11         System.out.println("dateStr = " + dateStr);  //21-3-13 下午10:33
12 
13         //解析:格式化的逆过程,字符串——>日期
14         String str = "21-3-13 下午10:33";
15         Date parseDate = format.parse(str);
16         System.out.println("parseDate = " + parseDate);  //Sat Mar 13 22:33:00 CST 2021
17 
18 
19         //按照指定的方式格式化和解析:调用带参的构造器
20         //调用带参的构造器
21         SimpleDateFormat format1 = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
22 
23         Date date1 = new Date();
24         System.out.println("date1 = " + date1);  //Sat Mar 13 22:33:52 CST 2021
25 
26         //格式化:日期——>字符串
27         String dateStr1 = format1.format(date1);
28         System.out.println("dateStr1 = " + dateStr1);  //2021-03-13 10:34:54
29 
30         //解析:格式化的逆过程,字符串——>日期
31         String str1 = "2021-03-13 10:34:54";
32         Date parseDate1 = format1.parse(str1);
33         System.out.println("parseDate1 = " + parseDate1); // Sat Mar 13 10:34:54 CST 2021
34     }

  注意:在使用 parse 方法的时候声明了一个异常叫做 ParseException,如果字符串和构造方法的模式不一样,那么就会抛出此异常。这里使用 throws 继续抛出由 JVM 虚拟机来处理。

  

五、Calendar日历类

  1、概述

    Calendar 是一个抽象基类,主要用于完成日期字段之间相互操作的功能。

    该类将所有可能用到的时间信息封装为静态成员变量,方便获取。日历类就是方便获取各个时间属性

  2、获取实例

    类的继承结构:

    

 

       可以看到 Calendar 是一个抽象类,那么怎么获取它的实现类呢?

    获取 Calendar 实例的方法:

Calendar calendar = Calendar.getInstance();  //调用其静态方法getInstance()
Calendar calendar = new GregorianCalendar(); //创建其子类(GregorianCalendar)的对象

     GregorianCalendar(公历)是Calendar的一个具体子类,提供了世界上大多数国家/地区使用的标准日历系统。

  3、常用方法

    一个 Calendar 的实例是系统时间的抽象表示,通过get(int field) 方法来取得想要的时间信息。

    其中 field 是 Calendar 类中声明的常量:

    

     常用方法:

public int get(int field) 根据 filed 获取对应的值
public void set(int field, int value) 根据 filed 设置对应的值,会修改 Calendar 对象
public void add(int field, int amount) 在对应的 field 上加上对应的值 public final Date getTime() 返回 date 对象,将 Calendar 对象转换为 Date 对象 public final void setTime(date):将 date 对象转换为 Calendar对象

 

  4、案例

 1     @Test
 2     public void test5() {
 3         Calendar calendar1 = new GregorianCalendar();
 4 
 5         Calendar calendar = Calendar.getInstance();
 6 
 7         //get()
 8         int days = calendar.get(Calendar.DAY_OF_MONTH);
 9         System.out.println("days = " + days);                   //days = 13
10         System.out.println(calendar.get(Calendar.DAY_OF_YEAR)); //72
11 
12         //set() 这里会改变 Calendar 对象的属性,Calendar是可变的
13         calendar.set(Calendar.DAY_OF_MONTH, 22);
14         days = calendar.get(Calendar.DAY_OF_MONTH);
15         System.out.println("days = " + days);   //days = 22
16 
17         //add()
18         calendar.add(Calendar.DAY_OF_MONTH, -3);
19         days = calendar.get(Calendar.DAY_OF_MONTH);
20         System.out.println("days = " + days);   //days = 19
21 
22         //getTime(): 日历类——> Date
23         Date date = calendar.getTime();
24         System.out.println("date = " + date);  //date = Fri Mar 19 23:04:41 CST 2021
25 
26         //setTime(): Date ——> 日历类
27         Date date1 = new Date();
28         calendar.setTime(date1);
29         days = calendar.get(Calendar.DAY_OF_MONTH);
30         System.out.println("days = " + days);  //days = 13
31     }

   注意

    ① 获取月份时,一月是 0,二月是1,以此类推,12月是11

    ② 获取星期时:周日是1,周一是2... 周六是 7;

  5、其他

   Calendar 的信息:

 1 //默认语言环境的时间(时区)
 2         Calendar c = new GregorianCalendar();
 3         /*
 4          * java.util.GregorianCalendar[
 5          * time=1480667849712,
 6          * areFieldsSet=true,
 7          * areAllFieldsSet=true,
 8          * lenient=true,
 9          * zone=sun.util.calendar.ZoneInfo[id="Asia/Shanghai",offset=28800000,dstSavings=0,useDaylight=false,transitions=19,lastRule=null],
10          * firstDayOfWeek=1,
11          * minimalDaysInFirstWeek=1,
12          * ERA=1,
13          * YEAR=2016,
14          * MONTH=11,
15          * WEEK_OF_YEAR=49,//本年第49周
16          * WEEK_OF_MONTH=1,//本月第1周
17          * DAY_OF_MONTH=2,
18          * DAY_OF_YEAR=337,//本年第337天
19          * DAY_OF_WEEK=6,
20          * DAY_OF_WEEK_IN_MONTH=1,        
21          * AM_PM=1, //下午
22          * HOUR=4,
23          * HOUR_OF_DAY=16,  //HOUR是12小时制, HOUR_OF_DAY是24小时制
24          * MINUTE=37,
25          * SECOND=29,
26          * MILLISECOND=712,
27          * ZONE_OFFSET=28800000,
28          * DST_OFFSET=0]
29          */
30         public static void main(String[] args) {
31             //默认语言环境的时间(时区)
32         Calendar c = new GregorianCalendar();
33         
34         int year=c.get(Calendar.YEAR);
35         int month=c.get(Calendar.MONTH);
36         int date=c.get(Calendar.DAY_OF_MONTH);
37         
38         int hour=c.get(Calendar.HOUR_OF_DAY);
39         int minute=c.get(Calendar.MINUTE);
40         int second=c.get(Calendar.SECOND);
41         int mill=c.get(Calendar.MILLISECOND);
42         int week=c.get(Calendar.DAY_OF_WEEK);
43         
44         StringBuffer dateStr=new StringBuffer();
45         dateStr.append(year).append("年");
46         dateStr.append(month+1).append("月");
47         dateStr.append(date).append("日").append("  ");
48         dateStr.append(hour).append("时");
49         dateStr.append(minute).append("分");
50         dateStr.append(second).append("秒");
51         dateStr.append(mill).append("毫秒").append("  ");
52         
53         String[] weeks={"日","一","二","","四","五","六"};
54         dateStr.append("星期").append(weeks[week-1]);
55         
56         System.out.println(dateStr);
57     }

 

  根据指定的日期获取对象:

 1 public static void main(String[] args) {
 2         Calendar c = new GregorianCalendar(2020, 6, 13);
 3 //        c.set(2018, Calendar.DECEMBER, 4, 12, 12, 0);
 4 //        c.setTime(new Date());
 5         //15天之后
 6         //c.add(Calendar.DATE, 15);
 7         //2个月之前
 8         //c.add(Calendar.DAY_OF_MONTH, -2);
 9         //12小时之后
10         c.add(Calendar.HOUR, 12);
11         
12         Date time = c.getTime();//转成日期
13         System.out.println(time);
14     }

 

  getInstance() 方法

public static Calendar getInstance()使用默认时区和语言环境获得一个日历。返回的 Calendar 基于当前时间,使用了默认时区和默认语言环境。
public static Calendar getInstance(TimeZone zone, Locale aLocale)使用指定时区和语言环境获得一个日历。返回的 Calendar 基于当前时间,使用了给定的时区和给定的语言环境。 

  Demo:

 1   public static void main(String[] args) {
 2         Calendar c = Calendar.getInstance();
 3         System.out.println(c);
 4         
 5         Calendar c2 = Calendar.getInstance(TimeZone.getTimeZone("Asia/Shanghai"), Locale.CHINA);
 6         System.out.println(c2);
 7         
 8         Calendar c3 = Calendar.getInstance(TimeZone.getTimeZone("America/New_York"), Locale.US);
 9         System.out.println(c3);
10     }

 

六、java.util.TimeZone和Locale

  Locale 对象表示了特定的地理、政治和文化地区。需要 Locale 来执行其任务的操作称为语言环境敏感的 操作,它使用 Locale 为用户量身定制信息。例如,显示一个数值,日期就是语言环境敏感的操作,应该根据用户的国家、地区或文化的风俗/传统来格式化该数值。

  获取 Locale 对象:

 Locale(String language)
 Locale(String language, String country)
 Locale.CHINA、Locale.US等

  Demo:

1     public static void main(String[] args) {
2         Locale loc = Locale.CHINA;
3         System.out.println(loc);//zh_CN
4         System.out.println(Locale.US);//en_US
5         System.out.println(Locale.JAPAN);//ja_JP
6         
7         Locale c = new Locale("zh","CN");
8         System.out.println(c);
9     }

 

  通常,使用 TimeZone的getDefault 获取 TimeZone,getDefault 基于程序运行所在的时区创建 TimeZone。例如,对于在日本运行的程序,getDefault 基于日本标准时间创建 TimeZone 对象。

  也可以用TimeZone的 getTimeZone 及时区 ID 获取 TimeZone 。例如美国太平洋时区的时区 ID 是 "America/Los_Angeles"。因此,可以使用下面语句获得美国太平洋时间 TimeZone 对象:

TimeZone tz = TimeZone.getTimeZone("America/Los_Angeles");

  

  Demo:

 1    public static void main(String[] args) {
 2         TimeZone t = TimeZone.getDefault();
 3         System.out.println(t);
 4 
 5         String[] all = TimeZone.getAvailableIDs();
 6         for (String id : all) {
 7             System.out.println(id);
 8         }
 9         
10 
11         TimeZone t1 = TimeZone.getTimeZone("America/New_York");
12         System.out.println(t1);
13         
14         TimeZone t2 = TimeZone.getTimeZone("Asia/Shanghai");
15         System.out.println(t2);
16     }
17     

 

posted on 2021-03-13 23:14  格物致知_Tony  阅读(237)  评论(0编辑  收藏  举报