JAVA日期时间(Calendar/Date)

java.util包下的Calendar和Date类来处理有关于时间操作.

 java.util.Date

 Date 类提供两个构造函数来实例化 Date 对象。

第一个构造函数使用当前日期和时间来初始化对象。

Date()

第二个构造函数接收一个参数,该参数是从1970年1月1日起的毫秒数。

Date(long millisec)

当调用无参构造方法时即为获取当前时间.

对于Date类常见的操作有时间的比较,按特定格式格式化Date,将String类型时间字符串转换为Date类型

1.日期比较

Java使用以下三种方法来比较两个日期:

  • 使用 getTime() 方法获取两个日期(自1970年1月1日经历的毫秒数值),然后比较这两个值.
  • 使用方法 before(Date date),after(Date date) 和 equals(Object object).
  • 使用 compareTo() 方法.

方法定义如下:

boolean after(Date date)

若当调用此方法的Date对象在指定日期之后返回true,否则返回false

boolean before(Date date)

如当调用此方法的Date对象在指定日期之前返回true,否则反水false

int compareTo(Date anotherDate)

比较调用当前方法的Date对象和指定的anotherDate对象.相等返回0,调用对象在指定对象之前返回负数,反之返回正数

2.Date转换成指定格式的字符串

SimpleDateFormat 是一个以语言环境敏感的方式来格式化和分析日期的类。SimpleDateFormat 允许你选择任何用户自定义日期时间格式来运行

SimpleDateFormat的构造方法如下:
SimpleDateFormat(String pattern)

时间模式字符串常见的如下:
字母 描述 示例

y 四位年份 2001
M 月份 July or 07
d 一个月的日期 10
h  A.M./P.M. (1~12)格式小时 12
H 一天中的小时 (0~23) 22
m 分钟数 30
s 秒数 55
S 毫秒数 234
E 星期几 Tuesday
D 一年中的日子 360
F 一个月中第几周的周几 2 (second Wed. in July)
w 一年中第几周 40
W 一个月中第几周 1
a A.M./P.M. 标记

PM

使用 SimpleDateFormatter.format(Date date)方法将Date类型对象转换成字符串
实例:
   SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        String format = simpleDateFormat1.format(new Date());
        System.out.println(format);//2018-06-25 17:12:22

3.时间类型字符串转换成Date对象

SimpleDateFormat 类有一些附加的方法,特别是parse(),它试图按照给定的SimpleDateFormat 对象的格式化存储来解析字符串。例如:

public static void main(String args[]) {
      SimpleDateFormat ft = new SimpleDateFormat ("yyyy-MM-dd HH:mm:ss"); 
      String input = "2018-06-25 17:12:22"; 
      Date t; 
      try { 
          t = ft.parse(input); 
          System.out.println(t); 
      } catch (ParseException e) { 
          System.out.println("Unparseable using " + ft); 
      }
   }

java.util.calendar

Date对象创建以及Date对象与String类型的转换,java.util.Date比较擅长,但是设置和获取日期数据的特定部分呢,比如说小时,日,或者分钟? 我们又如何在日期的这些部分加上或者减去值呢? 答案是使用Calendar 类

创建一个代表系统当前日期的Calendar对象

Calendar c = Calendar.getInstance();//默认是当前日期

创建一个指定日期的Calendar对象

使用Calendar类代表特定的时间,需要首先创建一个Calendar的对象,然后再设定该对象中的年月日参数来完成。

//创建一个代表2009年6月12日的Calendar对象
Calendar c1 = Calendar.getInstance();
//c1.set(int year,int month,int day)
c1.set(2009, 6 - 1, 12);//month从0开始

Calendar类对象字段类型

Calendar类中用以下这些常量表示不同的意义,jdk内的很多类其实都是采用的这种思想

常量 描述
Calendar.YEAR 年份
Calendar.MONTH 月份
Calendar.DATE 日期
Calendar.DAY_OF_MONTH 日期,和上面的字段意义完全相同
Calendar.HOUR 12小时制的小时
Calendar.HOUR_OF_DAY 24小时制的小时
Calendar.MINUTE 分钟
Calendar.SECOND
Calendar.DAY_OF_WEEK 星期几

如果只设定某个字段,例如日期的值,则可以使用如下set方法:

public void set(int field,int value)

实例:

calendar.set(Calendar.YEAR, 2017);
        calendar.set(Calendar.MONDAY, 2);
        calendar.set(Calendar.DATE, 30);
        calendar.add(Calendar.MONDAY, 5);

Calendar类对象信息的获得

Calendar c1 = Calendar.getInstance();
// 获得年份
int year = c1.get(Calendar.YEAR);
// 获得月份
int month = c1.get(Calendar.MONTH) + 1;
// 获得日期
int date = c1.get(Calendar.DATE);
// 获得小时
int hour = c1.get(Calendar.HOUR_OF_DAY);
// 获得分钟
int minute = c1.get(Calendar.MINUTE);
// 获得秒
int second = c1.get(Calendar.SECOND);
// 获得星期几(注意(这个与Date类是不同的):1代表星期日、2代表星期1、3代表星期二,以此类推)
int day = c1.get(Calendar.DAY_OF_WEEK);

Calendar与Date对象的转换

 Calendar-->Date

Calendar calendar=Calendar.getInstance();  
Date time = calendar.getTime();
 Date-->Calendar
Date date=new Date();
Calendar cal=Calendar.getInstance();
cal.setTime(date);
补充:

Calendar类实现了公历日历,GregorianCalendar是Calendar类的一个具体实现。

Calendar 的getInstance()方法返回一个默认用当前的语言环境和时区初始化的GregorianCalendar对象

在判断是否为闰年是可以使用isLeapYear(int year)

boolean isLeapYear(int year)

确定给定的年份是否为闰年。

实例:

    public static void main(String[] args) {
//在具有默认语言环境的默认时区内使用当前时间构造一个默认的 GregorianCalendar。
        GregorianCalendar gregorianCalendar = new GregorianCalendar();
        int year = gregorianCalendar.get(Calendar.YEAR);
        if (gregorianCalendar.isLeapYear(year)) {
            System.out.println("今年是闰年!");
        } else {
            System.out.println("今年不是闰年!");
        }
    }

Java 8通过发布新的Date-Time API (JSR 310)来进一步加强对日期与时间的处理。

在旧版的 Java 中,日期时间 API 存在诸多问题,其中有:

  • 非线程安全 − java.util.Date 是非线程安全的,所有的日期类都是可变的,这是Java日期类最大的问题之一。

  • 设计很差 − Java的日期/时间类的定义并不一致,在java.util和java.sql的包中都有日期类,此外用于格式化和解析的类在java.text包中定义。java.util.Date同时包含日期和时间,而java.sql.Date仅包含日期,将其纳入java.sql包并不合理。另外这两个类都有相同的名字,这本身就是一个非常糟糕的设计。

  • 时区处理麻烦 − 日期类并不提供国际化,没有时区支持,因此Java引入了java.util.Calendar和java.util.TimeZone类,但他们同样存在上述所有的问题。

Java 8 在 java.time 包下提供了很多新的 API。以下为两个比较重要的 API:

  • Local(本地) − 简化了日期时间的处理,没有时区的问题。

  • Zoned(时区) − 通过制定的时区处理日期时间。

新的java.time包涵盖了所有处理日期,时间,日期/时间,时区,时刻(instants),过程(during)与时钟(clock)的操作。

实例:

        LocalDateTime now = LocalDateTime.now();
        System.out.println("当期dateTime为:" + now);

        LocalDate localDate = now.toLocalDate();
        System.out.println("当前日期为 :" + localDate);

        LocalTime localTime = now.toLocalTime();
        System.out.println(localTime);

具体新特性参考java8 API.



----------------------分隔符

以上仅作个人学习,如有侵权请联系删除.谢谢

    结尾语:

     有志者、事竟成,破釜沉舟,百二秦关终属楚;
  苦心人、天不负,卧薪尝胆,三千越甲可吞吴。


猜你喜欢

转载自blog.csdn.net/baidu_28665563/article/details/80802739