JavaSE核心API--日期操作类

java.util.Date

1)理论讲解:使用Calendar计算时间

  使用Calendar计算时间

  void add(int field,int amount)
  对指定时间分量加上给定的值,若给定的值为负数则是减去

代码演示:

    Calendar calendar=Calendar.getInstance();
    System.out.println(calendar.getTime());
    /*
     * 3年2个月零25天以后是哪天?
     */
    // 加3年
    calendar.add(Calendar.YEAR, 3);
    // 加2个月
    calendar.add(Calendar.MONTH, 2);
    // 加25天
    calendar.add(Calendar.DAY_OF_YEAR, 25);
    System.out.println(calendar.getTime());
    // 调整为当周的周三
    calendar.set(Calendar.DAY_OF_WEEK, Calendar.WEDNESDAY);
    System.out.println(calendar.getTime());

2)理论讲解:获取时间分量

  Calendar提供了获取指定时间分量所对应的值的方法
  int get(int field)

  int值表示时间分量,Calendar提供了大量的常量与之对应

代码演示:

    Calendar calendar=Calendar.getInstance();

    // 获取年
    int year=calendar.get(Calendar.YEAR);
    // 获取月(月的值从0开始,即0表示1月)
    int month=calendar.get(Calendar.MONTH)+1;
    /*
     * 获取日
     * 和天相关的常量
     * DAY_OF_MONTH:月中的天
     * DAY_OF_WEEK:周中的天
     * DAY_OF_YEAR:年中的天
     * DATE:与DAY_OF_MONTH一致
     */
    int day=calendar.get(Calendar.DATE);
    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);

    // 今年是今年的第几天
    int doy=calendar.get(Calendar.DAY_OF_YEAR);
    System.out.println("今天是今年的第"+doy+"天");

    // 今天星期几?
    int dow=calendar.get(Calendar.DAY_OF_WEEK)-1;
    String[] data= {"日","一","二","三","四","五","六"};
    System.out.println("今天是周"+data[dow]);

    /*
     * 获取指定时间分量所允许的最大值
     */
    int days=calendar.getActualMaximum(Calendar.DAY_OF_YEAR);
    System.out.println("今年共"+days+"天");

3)理论讲解:设置指定的时间分量对应的值

代码演示:

    Calendar calendar=Calendar.getInstance();
    System.out.println(calendar.getTime());

    //设置为2008
    calendar.set(Calendar.YEAR, 2008);
    calendar.set(Calendar.MONTH, 7);
    /*
     * set方法由一个注意事项:
     * 当set设置了两次,而两次影响的时间分量一致时:
     * 比如设置几号后,又设置了周几,这两个看似不同的时间分量实际影响的都是月中的天
     * 那么后设置的会覆盖之前设置的操作,若想它们都起效果
     * 可以在设置一个后,调用getTime方法计算一下修改后的日期然后再设置另一个
     */
    calendar.set(Calendar.DATE, 8);
    //注释下面的输出语句与不注释效果是不同的
//  System.out.println(calendar.getTime());
    // 设置为周三
    calendar.set(Calendar.DAY_OF_WEEK, 4);

    System.out.println(calendar.getTime());

3)理论讲解:Calender类

  java.util.Calender
  日历类,本身是一个抽象类,规定了日历类的功能定义

  常用实现类:GregorianCalendar,即:阳历

  Calendar是操作时间的API

代码演示:

    Calendar calendar=Calendar.getInstance();
    System.out.println(calendar);

    System.out.println(calendar.getTime());

4)理论讲解:Date类

  java.util.Date
  Date的每一个实例用于表示一个具体的时间,内部维护一个long值
  表示自1970年1月1日 00:00:00到该Date表示的时间之间所经过的毫秒
  由于Date存在时区问题和千年虫问题,因此大部分操作时间的方法都被声明为过时的,不再建议使用了

代码演示:

    Date now=new Date();
    System.out.println(now);

    long time=now.getTime();
    System.out.println(time);

    now.setTime(0);
    System.out.println(now);

5)理论讲解:格式转换

  java.text.SimpleDateFormat
  可以在String与Date之间相互转换

代码演示:

    Date now=new Date();
    System.out.println(now);

    SimpleDateFormat sdf=new SimpleDateFormat("yyyy年MM月dd日 E a hh:mm:ss");
    System.out.println(sdf.format(now));

6)理论讲解:将一个字符串解析为Date

代码演示:

    String str="2008-08-08 08:08:08";
    SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
    try {
        Date date = sdf.parse(str);
        System.out.println(date);
    } catch (ParseException e) {
        e.printStackTrace();
    }

7)小练习1.创建一个线程,在控制台不断输出当前时间,精确到时分秒,每隔一秒输出一次。

public class Test {
   public static void main(String[] args) {
        Thread thread = new MyThread();
        thread.start();
   }
}
// 通过继承Thread类 来重写run方法
class MyThread extends Thread {
   // 通过正则式来设置输出的时间格式
   SimpleDateFormat s = new SimpleDateFormat("yyyy年MM月dd日  HH:mm:ss");
   // 重写run()方法
   public void run() {
       while (true) {
          String str = s.format(new Date());
          System.out.println(str);
          try {
               // 间隔时间1秒
               Thread.sleep(1000);
          } catch (InterruptedException e) {
               e.printStackTrace();
          }
       }
   }
}

8)小练习2.程序启动后要求输入用户的生日,格式:yyyy-MM-dd,然后经过程序运算输出到今天为止一共活了多少天?再输出该用户出生10000天的纪念日为哪天?格式:yyyy-MM-dd.

public static void main(String[] args) throws ParseException {
    // 获取用户输入的生日
    Scanner scan = new Scanner(System.in);
    System.out.println("请输入您的生日(格式为yyyy-MM-dd):");
    String str = scan.nextLine();
    scan.close();

    // 把字符串转换为日期格式
    Date date = new SimpleDateFormat("yyyy-MM-dd").parse(str);

    // 获取今天的日期
    Date now = new Date();

    // 计算活了多少天
    long day = (now.getTime() - date.getTime()) / 1000 / 60 / 60 / 24;
    System.out.println("您一共活了" + day + "天!");
    System.out.println(day / 365 + "年" + day % 365 / 30 + "个月" + day % 365 % 30 / 7 + "周零" + day % 365 % 30 % 7 + "天");

    // 计算10000天纪念日
    now.setTime(now.getTime() + (10000 - day) * 24 * 60 * 60 * 1000);
    SimpleDateFormat sdf = new SimpleDateFormat("yyyy年MM月dd日 E a hh:mm:ss");
    System.out.println("您的10000天纪念日为:" + sdf.format(now));

//  SimpleDateFormat sdf=new SimpleDateFormat("yyyy年MM月dd日 E a hh:mm:ss");
//  long time=date.getTime()+1000L*60*60*24*10000;
//  System.out.println("您出生1万天的纪念日为:"+sdf.format(time));
}

9)小练习3.计算商品促销日期,程序启动后,要求用户输入商品生产日期,格式:yyyy-MM-dd,然后再输入保质期的天数,经过程序运算后输出该商品的促销日期,格式:yyyy-MM-dd,规则:商品过期日前两周的周三.

public static void main(String[] args) throws ParseException {
    Scanner scan = new Scanner(System.in);
    System.out.println("请输入商品生产日期:");
    String s1 = scan.nextLine();
    System.out.println("请输入商品保质期:");
    int day = Integer.parseInt(scan.nextLine());
    scan.close();

    // 把字符串转换为日历格式
    Date date = new SimpleDateFormat("yyyy-MM-dd").parse(s1);// 字符串转日期格式
    Calendar calendar = Calendar.getInstance();
    calendar.setTime(date);// 日期转日历格式

    // 过期时间

    // 加保质期的天数
    calendar.add(Calendar.DAY_OF_YEAR, day);

    System.out.println(day + "天过后的日期为:" + new SimpleDateFormat("yyyy-MM-dd E").format(calendar.getTime()));

    // 2周前(-14天)
    calendar.add(Calendar.DAY_OF_YEAR, -14);

    // 调整为周三
    calendar.set(Calendar.DAY_OF_WEEK, Calendar.WEDNESDAY);

    System.out.println("该商品的促销日期为:" + new SimpleDateFormat("yyyy-MM-dd E").format(calendar.getTime()));// 日历转日期格式
}