Java基础——与时间相关的类

来自:https://www.cnblogs.com/caoyc/p/4546527.html

           https://www.cnblogs.com/fulitaiblogs/p/3763155.html

一、Data及其常用API

1、简介

  Java中的时间使用标准类库的java.util.Date,其表示特定的瞬间,精确到毫秒。是用距离一个固定时间点的毫秒数(可正可负,long类型)表达一个特定的时间点。

固定的时间点叫纪元(epoch),是UTC时间1970年 1月 1日 00:00:00  ,UTC(Universal Time Coordinated世界调整时间)与GMT(Greenwich Mean Time格林威治时间)一样,是一种具有实际目的的科学标准时间。

  因为Date的设计具有"千年虫"以及"时区"的问题,所以Date中的大部分方法已经不建议使用了,它们都被java.util.Calendar类所取代,该类我们稍后会讲解。

2、构造函数

  ①:new Date() :返回系统当前时间的Date对象

  ②:new Date(long date):给定指定毫秒数,返回Date对象

  ③:new Date(int year, int month,int date) :根据年月日返回Date对象

     注意:year:107表示2007年   年份=1900+year   。例如要表示2015年,则year=2015-1900=115

             month:0表示1月        月份=month+1     。例如要表示6月,则month=6-1=5 。如果月份大于11会产生向年份进位。

      date:日如果大于该月的最大值时,同样会向月进位

  ④:new Date(int year,int  month,int  date,int  hrs,int  min)

  ⑤:new Date(int year,int  month,int  date,int  hrs,int  min,int  sec)

      注意:时分秒同样也会产生进位

3、常用方法

  ①:setTime(long time) 设置一个时间,long表示的这个时间点距离1970年1月1日 00:00:00之间的毫秒差。

  ②:getTime():获取该时间距离1970年1月1日 00:00:00之间的毫秒差

 

二、SimpleDateFormat

1、简介

  SimpleDateFormat 是一个以与语言环境有关的方式来格式化和解析日期的具体类。它允许进行格式化(日期 -> 文本)、解析(文本 -> 日期)和规范化。

 

2、日期模式匹配字符串

字符含义示例
yyyyy年---2015年
MMM月--03月
ddd日--12日
E星期E--星期日
a上下午a--上午(AM)
H24小时制HH时--16时
h12小时制hh时--04时
mmm--23分
sss--59秒
S毫秒SSS毫秒-567毫秒

  例如yyyy-MM-dd HH:mm:ss.SSS可以匹配2015-06-02 14:32:13.546

 

3、将Date转换成String

Date date=new Date();
SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS");
System.out.println(sdf.format(date)); 

 

4、将String转换成Date

SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS");
Date date =sdf.parse("2015-06-02 14:35:36.000");
System.out.println(date); 

 

三、Calendar类

1、简介

  java.util.Calendar 类用于封装日历信息,其主要作用在于其方法可以对时间分量进行运算。

Calendar是抽象类,其具体子类针对不同国家的日历系统,其中应用最广泛的是GregorianCalendar(格里高里历,即通用的阳历),对应世界上绝大多数国家/地区使用的标准日历系统。

2、 getInstance()方法

Calendar是抽象类,其提供了一个工厂方法:Calendar getInstance()。该方法可以根据当前系统所在地区获取一个适当的Calendar的子类实现。

在实际开发中,也推荐使用该方法来实例化Calendar的对象。

SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS");
Calendar calendar=Calendar.getInstance();
System.out.println(sdf.format(calendar.getTime()));

3、设置日期及时间分量

  Calendar提供了一种通用的设置时间的方式:

  void set(int field,int value)

  该方法可以通过对不同的时间分量分别设置不同的值。Calendar对不同的时间分量提供了相应的常量,我们在使用set方法设置时,第一个参数就应当使用对应的常量作为时间分量。

  注意:分量month同样从0开始,分量也有进位的可能

4、setTime与getTime

  设置和获取的对象都是Data类型,而Date对象对应的这两个方法,是long类型的

5、void add(int field,int amount)

  该方法可以为某个时间分量的值加上给定的值,若想减去给定的值,那么传入的值需要时负数即可。并且计算后会自动进行相应的进位。

6、int  getActualMaximum(int field)

  获取该分量的最大值

四、sql包下的时间类

 

为什么要有java.sql.Date这个类呢?

我们发现除了父类Date在util包下,它的三个子类都是在sql包下的。因为在和数据库打交道时(也就是在执行sql语句时),我们要用到sql包下的时间类,其他情况下我们通常用util包下的Date来格式化日期或者得到当前时间。为什么和数据库打交道时不能用java.util.Date?因为PreparedStatement有三个设置时间的方法:setDate()、setTime()、setTimeStamp(),这三个方法的第二个参数分别是java.sql.Date、java.sql.Time和java.sql.TimeStamp,并没有提供参数是java.util.Date的方法。除此之外,ResultSet也有三个get()方法与之对应,且返回的时间类型也是sql包下的这三个类。


java.sql.Date日期格式为:年月日
java.sql.Time日期格式为:时分秒 
java.sql.Timestamp日期格式为:年月日时分秒纳秒(毫微秒)

 java.sql.Date类

(1)getTime方法返回毫秒数

(2)互相转换

new java.sql.Date(new java.util.Date().getTime())

new java.util.Date(new java.sql.Date(0).getTime())

五、利用以上各个类的功能,我们可以很简单的实现一些时间计算的功能,下面看几个方法:

  l、判断是否是闰年

    /**

     * 给定一个年份判断该年份是否为闰年

     */

    public static boolean isLeapYear(int year) {

       GregorianCalendar calendar = new GregorianCalendar();

       return calendar.isLeapYear(year);

    }

 

  2、获取当前日期的字符串表示形式

    /**

     * 利用SimpleDateFormat获取当前日期的字符串表示形式 格式:2009-5-05

     */

    public static String getCurrentDate() {

       SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");

       return dateFormat.format(System.currentTimeMillis());

    }

 

  3、给出任意一个年月日得到该天是星期几

    /**

     * 给出任意一个年月日得到该天是星期几

     */

    public static int getWeek(String date) {

       // 注意参数的大小写格式

        SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");

       Calendar c = Calendar.getInstance();

       try {

           Date d = dateFormat.parse(date);

           c.setTime(d);

       } catch (ParseException e) {

       }

       return c.get(Calendar.DAY_OF_WEEK)-1;

    }

 

  4、 获得今天n天以后或者n天以前是那一天

    /**

     * 获得距离今天n天的那一天的日期

     */

    public static String getDistanceDay(int day) {

       Calendar calen = Calendar.getInstance();

       calen.add(Calendar.DAY_OF_MONTH, day);

       Date date = calen.getTime();

       // 这里也个用SimpleDateFormat的format()进行格式化,然后以字符串形式返回格式化后的date

       SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");

       return dateFormat.format(date);

}

 

  5、 获得距离指定日期n天的那一天的日期

    /**

     * 获得距离指定日期n天的那一天的日期

     */

    public static String getDistanceDay(String date, int day) {

       SimpleDateFormat dateFormat = new SimpleDateFormat("yyyyMMdd");

       Date d;

       Calendar c =Calendar.getInstance();

       try {

           d = dateFormat.parse(date);

           c.setTime(d);

           c.add(Calendar.DATE, day);

 

       } catch (ParseException e) {

           e.printStackTrace();

       }

       return dateFormat.format(c.getTime());

    }

 

  6、获得给定两个日期相差的天数

    /**

     * 获得给定两个日期相差的天数

     *

     */

    public static long getGapDays(String date1, String date2) {

       String[] d1 = date1.split("-");

       String[] d2 = date2.split("-");

       Calendar c = Calendar.getInstance();

       c.set(Integer.parseInt(d1[0]), Integer.parseInt(d1[1]), Integer

              .parseInt(d1[2]), 0, 0, 0);

       long l1 = c.getTimeInMillis();

       c.set(Integer.parseInt(d2[0]), Integer.parseInt(d2[1]), Integer

              .parseInt(d2[2]), 0, 0, 0);

       long l2 = c.getTimeInMillis();

       return (Math.abs(l1 - l2) / (24 * 60 * 60 * 1000));

    }

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值