日期与时间

时间:2021-6-7 作者:qvyue

Java中日期与时间API – Date类

什么是Date类

java.util.Date类是java中可以表示时间(精确到毫秒)的对象
Date的每一个实例用于表示一个时间,内部维护一个long值,该值保存的是自1970年元旦到当前Date所表示的时间之间经过的毫秒。

为什么需要Date类

有了Date类我们才能表示日期或时间,比如今天是哪年哪月哪日,比如跑步用了几分几秒,如果没有时间那么这些需求都非常难以实现

Date类的注意事项

Date内部由于存在千年虫和时区的问题,因此大部分方法都被声明为过时的,不再建议使用了。

package day03;

import java.util.Date;

/**
 * java.util.Date
 * Date的每一个实例用于表示一个具体的时间
 * 内部维护一个long值,该值表示UTC时间,即:
 * 公园1970年元旦到该Date表示的时间之间所经过的毫秒
 * 
 * 由于Date存在设计缺陷,所以大部分方法已经被声明为
 * 过时方法,不再建议使用。
 * 
 * @author adminitartor
 *
 */
public class DateDemo1 {
    public static void main(String[] args) {
        /*
         * 默认创建出来表示当前系统时间
         */
        Date date = new Date();
        /*
         * Date重写了toString,用来显示其表示的日期和时间
         */
        System.out.println(date);
        
        //Date提供的大部分方法都是过时方法,不要使用
//      int year = date.getYear();
        
        /*
         * long getTime()
         * 获取Date内部维护的long值
         */
        long time = date.getTime();
        System.out.println(time);
        
        time = time + 1000*60*60*24;
        /*
         * void setTime(long time)
         * 对Date设置一个long值使其表示该日期
         */
        date.setTime(time);
        System.out.println(date);
        
    }
}

SimpleDateFormat类

什么是SlmpleDateFormat

它是一个能将Date对象和字符串对象相互转换的类,可以按照约定好的格式转换,操作很方便

将一个时间转换成字符串

y:年 yyyy年–2013年;yy年–13年
M:月 MM月–01月;M月–1月
d:日 dd日–06日;d日–6日
E:星期 E–星期六
a:AM/PM
H:小时(24小时制) HH:mm:ss a
h:小时(12小时制)hh(a):mm:ss
m:分钟
s:秒

package day03;

import java.text.SimpleDateFormat;
import java.util.Date;

/**
 * java.text.SimpleDateFormat
 * 该类允许按照一个给定的日期格式在Date与String
 * 之间相互转换。
 * @author adminitartor
 *
 */
public class SimpleDateFormat_format {
    public static void main(String[] args) {
        Date now = new Date();
        System.out.println(now);
        /*
         * 2021-05-10 10:40:22
         * yyyy-MM-dd HH:mm:ss
         */
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        /*
         * String format(Date date)
         * 将给定的Date表示的日期按照当前SimpleDateFormat
         * 指定的格式转换为字符串
         */
        String str = sdf.format(now);
        System.out.println(str);
                    
    }
}

将字符串转换成时间类型

package day03;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;

/**
 * Date parse(String str)
 * 将给定个的字符串按照当前SimpleDateFormat指定的
 * 日期格式解析为一个Date对象来实际表示该日期
 * @author adminitartor
 *
 */
public class SimpleDateFormat_parse {
    public static void main(String[] args) throws ParseException {
        String str = "2008-08-08 20:08:08";
        
        SimpleDateFormat sdf = new SimpleDateFormat(
            "yyyy-MM-dd HH:mm:ss"   
        );
        //将字符串解析为Date
        Date date = sdf.parse(str);
        
        System.out.println(date);
    }
}

练习:计算到目前为止活了多少天;1000天后的纪念日

package day03;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Scanner;

/**
 * 程序启动后要求用户输入自己的生日
 * 格式如:1992-08-02
 * 经过程序计算,输出到今天为止活了多少天
 * 
 * @author adminitartor
 *
 */
public class Test {
    public static void main(String[] args) throws ParseException {
        Scanner scanner = new Scanner(System.in);
        System.out.println("请输入您的生日:(yyyy-mm-dd)");
        String birthStr = scanner.nextLine();   
        //将用户的生日转换为Date
        SimpleDateFormat sdf 
            = new SimpleDateFormat("yyyy-MM-dd");
        Date birthDate = sdf.parse(birthStr);   
        //当前系统时间
        Date now = new Date();  
        //计算今天与生日之间经过的好毫秒
        long time = now.getTime()-birthDate.getTime();
        //换算为天
        time = time/1000/60/60/24;
        System.out.println("恭喜您,已经活了"+time+"天!请继续保持!");
         //计算出生100e0天纪念日time = birth.getTime();
        time = time+1000L*60*60*24*10000;
        Date date = new Date(time) ;
        line = sdf.format(date) ;
        system.out.println("您出生100oo天的纪念日为: "+line) ;
    }
}

Calendar日历类

什么是Calendar

Calendar本身是一个抽象类,不能实例化,,只是规定了操作时间的相关方法等。
常用实现类:java.util.GregorianCalendar 即:阳历历法
格林高里历

为什么需要Calendar

Date类的设计有很多缺陷,比如2020年的Date对象获得年getYear()返回值为120等
使用Calendar能够弥补很多Date使用的不便

怎么使用calendar

我们可以通过Calendar提供的静态方法getlnstance来根据当前系统所在地区获取一个使用的实现类。大部分地区获取的都是阳历实现类。

Calendar基本使用

package day03;

import java.util.Calendar;
import java.util.Date;

/**
 * java.util.Calendar
 * 日历类,用于计算时间,操作时间使用。
 * Calendar是一个抽象类,只规定了操作时间的相关方法
 * 定义。并没有具体实现。
 * 常用的实现类GregorianCalendar,即:阳历历法
 * 
 * Calendar提供了一个静态方法getInstance,该方法可以
 * 根据当前系统所在地区返回一个合适的日历实现类,大部分
 * 返回的都是阳历实现类GregorianCalendar
 * 
 * 
 * 
 * 
 * @author adminitartor
 *
 */
public class Calendar_getInstance {
    public static void main(String[] args) {
        //默认表示当前系统时间
        Calendar calendar = Calendar.getInstance();
        
        System.out.println(calendar);
        
        /*
         * Calendar -> Date
         * Date getTime()
         * Calendar提供的getTime方法可以将其表示的时间
         * 以一个Date实例形式返回。
         */
        Date date = calendar.getTime();
        System.out.println(date);
        
        /*
         * Date -> Calendar
         * Calendar提供了方法:
         * void setTime(Date date)
         * 可以使当前Calendar表示给定的Date所表示的
         * 日期
         */
        calendar.setTime(date);
        
    }
}

Calender对象获取日期

Calendar提供了一个方法:

int get(int field)

该方法可以获取给定时间分量所对应的值。

参数是一个int值,不同的值表示不同的时间分量,无需记住每个值表示什么,因为Calendar提供了大量的常量表示了这些时间分量的值。

package day03;

import java.util.Calendar;

public class Calendar_get {
    public static void main(String[] args) {
        Calendar calendar = Calendar.getInstance();
        
        //获取年?
        int year = calendar.get(Calendar.YEAR);
        System.out.println(year);
        
        /*
         * 获取月?
         * 月从0开始,即:0表示1月,1表示2月...
         * 月在Calendar中的值有常量对应
         */
        int month = calendar.get(Calendar.MONTH)+1;
        
        //获取日?
                /*
         * 获取日
         * 和"天"相关的时间分量:
         * DATE:月中的天
         * DAY_OF_MONTH:月中的天,与DATE是一样的
         * DAY_OF_WEEK:周中的天,就是星期几
         * DAY_OF_YEAR :年中的天,今年的第几天
                 */
        int day = calendar.get(Calendar.DAY_OF_MONTH);
        
        System.out.println(year+"-"+month+"-"+day);
        
        int h = calendar.get(Calendar.HOUR_OF_DAY);
        int m = calendar.get(Calendar.MINUTE);
        int s = calendar.get(Calendar.SECOND);
        System.out.println(h+":"+m+":"+s);
        
        String[] data = {"日","一","二","三","四","五","六"};
        int dow = calendar.get(Calendar.DAY_OF_WEEK)-1;
        System.out.println("周"+data[dow]);
        
        int doy = calendar.get(Calendar.DAY_OF_YEAR);
        System.out.println("已经是今年的第"+doy+"天");
        
        /*
         * 获取给定时间分量所允许的最大值
         */
        int dd = calendar.getActualMaximum(Calendar.DAY_OF_YEAR);
        System.out.println("今年一共:"+dd+"天");
    }
}

Calender对象设置时间

Calendar提供了可以对指定时间分量设置一个值

void set(int field,int value)

参数需要传递要设置的时间分量,和设置的时间分量值

package chapter03;

import java.util.Calendar;

/**
* Calendar提供了可以对指定时间分量设置一个值
* void set(int field,int value)
* 参数需要传递要设置的时间分量,和设置的时间分量值
* @author tedu
*
*/
public class CalendarDemo03 {
    
    public static void main(String[] args) {
        Calendar calendar = Calendar.getInstance();//2021-5-12
        System.out.println(calendar.getTime());
        //2008-08-08 8:8:8
        calendar.set(Calendar.YEAR, 2008);
        System.out.println(calendar.getTime());
        
        calendar.set(Calendar.MONTH, 7);
        System.out.println(calendar.getTime());
        
        calendar.set(Calendar.DAY_OF_MONTH, 8);
        System.out.println(calendar.getTime());
        
        calendar.set(Calendar.HOUR_OF_DAY, 20);
        System.out.println(calendar.getTime());
        
        calendar.set(Calendar.MINUTE, 8);
        System.out.println(calendar.getTime());
        
        calendar.set(Calendar.SECOND, 8);
        System.out.println(calendar.getTime());
        
        calendar.set(Calendar.DAY_OF_WEEK, 4);
        System.out.println(calendar.getTime());
    }
    
}

Calendar时间计算

Calendar提供了用于计算时间的方法

void add(int field ,int value);

是给定的时间分量加上给定的值,若给定的值为负数则是减法

package chapter03;

import java.text.SimpleDateFormat;
import java.util.Calendar;

public class CalendarDemo04 {
    public static void main(String[] args) {
        Calendar calendar = Calendar.getInstance();
        //查看5年8个月69天后,再往前推130后的日期
        calendar.add(Calendar.YEAR, 5);
        calendar.add(Calendar.MONTH, 8);
        calendar.add(Calendar.DAY_OF_YEAR, 69);
        calendar.add(Calendar.DAY_OF_YEAR, -130);
        
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy/MM/dd");
        System.out.println(sdf.format(calendar.getTime()));
    }
}

小提示

时间转换的过程和使用到的方法
“2021-05-21”
String(parse) —> Date(Calender setTime) –> Calender(Calendar getTime) —> Date(format) –> String

声明:本文内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:qvyue@qq.com 进行举报,并提供相关证据,工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。