1. 程式人生 > 其它 >日期與時間

日期與時間

Date

java.util.Date類表示時間,JDK1.1之後推薦使用 java.util.Calendar類;

java.util.Date類中很多構造方法和方法已經過時(Deprecated),不推薦使用,

import java.util.Date;
public class DateTest {
    public static void main(String[] args) {
        //無參,使用當前時間構建Date物件
        Date date = new Date();
        System.out.println(date);
        //有參,引數為時間戳,中國東八區,1000毫秒=1秒鐘
        //使用一個long值構建Date物件,引數是距離1970.1.1.00:00:00以來的毫秒數,時間戳
        Date date1 = new Date(4000);//4秒
        System.out.println(date1);
        System.out.println(System.currentTimeMillis());/*當前日期的時間戳System.currentTimeMillis()*/
        //用當前的毫秒數構建Date
        Date date2 = new Date(System.currentTimeMillis());
        System.out.println(date2);
        System.out.println("****************************");
        System.out.println("date1的時間戳:" + date1.getTime());
        System.out.println(date.after(date1));
        System.out.println(date.before(date1));
        System.out.println(date.compareTo(date1));
        //1     1表示 date比date1日期要大 , -1表示date比date1日期要小 , 0相等
        System.out.println(date.compareTo(date2));//date2是最新時間
    }
}

Calendar

JDK1.1版本開始,增加Calendar類,建議使用Calendar類代替Date類;

Calendar是抽象類,不能直接使用new建立物件;

import java.util.Calendar;
import java.util.Date;
import java.util.Locale;
import java.util.TimeZone;
public class CalenderTest {
    public static void main(String[] args) {
        //使用預設時區和語言環境獲得日曆物件
        Calendar calendar1=Calendar.getInstance();
        System.out.println(calendar1);
        //使用指定的時區及語言環境獲得日曆物件
        Calendar calendar2= Calendar.getInstance(TimeZone.getTimeZone("Asia/Shanghai"), Locale.CHINA);
        System.out.println(calendar2);
        System.out.println("-------------get set--------------");
        //set,為calendar1,calendar2物件的欄位設定值
        calendar1.set(Calendar.YEAR,2001);
        calendar1.set(Calendar.MONTH,1);//0表示1月份……
        calendar1.set(Calendar.DATE,2);
        calendar1.set(Calendar.HOUR_OF_DAY,17);
        calendar1.set(Calendar.MINUTE,42);
        calendar1.set(Calendar.SECOND,37);
        //為calendar2物件設定年月日時分秒
        calendar2.set(1997,6,5,23,18,23);
        //get,getTime方法返回Date型別
        Date date1=calendar1.getTime();
        System.out.println(date1);
        Date date2=calendar2.getTime();
        System.out.println(date2);
        System.out.println(calendar1.get(Calendar.YEAR));
        //System.out.println(calendar2.MINUTE);//獲取calendar2.set的常量值
        System.out.println(calendar2.get(1));
        //Calendar.get方法其實就是通過傳入fields陣列中指定位置的下標來獲取想要的值,
        //如Calendar.YEAR這個常量就是1,fields[1]存的就是當前時間的年份
        System.out.println("--------------add-----------------");
        //add, 修改Calendar1的欄位值,將年份加2
        calendar1.add(Calendar.YEAR,2);
        System.out.println(calendar1.getTime());
    }
}

日期與時間資料的格式化方法

1、格式化

實際程式設計中,往往需要對時間用不同的格式進行展示;

SimpleDateFormat中定義了對時間進行格式化的方法;該類繼承了抽象父類DateFormat,某些方法在父類中定義,查閱API文件時注意;

可以自定義一個模式字串來構建SimpleDateFormat物件

private static void dateToString() {
    Calendar calendar = Calendar.getInstance();//獲取日曆物件
    calendar.set(Calendar.MONTH, 11);
    Date date = calendar.getTime();//將日曆物件用getTime方法轉換成Date物件
    //自定義格式
    //String pattern="yyyy年MM月dd日 HH時mm分ss秒";
    String pattern = "yy-M-d H:m:s";
    //構造方法傳入格式引數
    SimpleDateFormat sdf = new SimpleDateFormat(pattern);
    String format = sdf.format(date);//使用format格式化
    System.out.println(format);
    //System.out.println(sdf.format(cal.getTime()));//簡寫
}
/*22-12-9 20:4:5*/
yyyy:年
MM:月
dd:日
hh:1~12小時制(1-12)
HH:24小時制(0-23)
mm:分
ss:秒
S:毫秒
E:星期幾
D:一年中的第幾天
F:一月中的第幾個星期(會把這個月總共過的天數除以7)
w:一年中的第幾個星期
W:一月中的第幾星期(會根據實際情況來算)
a:上下午標識
k:和HH差不多,表示一天24小時制(1-24)。
K:和hh差不多,表示一天12小時制(0-11)。
z:表示時區  

2、解析時間字串

在實際程式設計中,往往一些時間內容都是通過使用者輸入獲得,得到的是字串,需要解析成日期時間型別進行處理;

SimpleDateFormat類不僅能夠格式化時間,還能解析時間字串;

public static void stringToDate() {
    SimpleDateFormat sdf=new SimpleDateFormat("yyyy年MM月dd日 HH時mm分ss秒SSS毫秒");
    String strDate = "2001年2月2日 12時20分30秒300毫秒";
    try {
        //parse把字串轉為日期Date型別物件,如果格式不匹配丟擲轉換異常
        System.out.println(sdf.parse(strDate));
        //把時間戳儲存在資料庫中
    } catch (ParseException e) {
        e.printStackTrace();
    }
}
/*Fri Feb 02 12:20:30 CST 2001
981087630300*/

3、LocalDate

JDK8中定義了java.time.LocalDate,用來表示日期,預設格式是yyyy-MM-dd;該類不包含時間資訊;

import java.time.LocalDate;
public class LocalDateTest {
    public static void main(String[] args) {
        System.out.println("-----獲取LocalDate物件-----");
        //now()  獲取當前日期的LocalDate物件
        LocalDate now=LocalDate.now();
        System.out.println(now);
        //of()  使用年月日數值生成LocalDate物件
        LocalDate localDate=LocalDate.of(2001,2,2);
        System.out.println(localDate);
        System.out.println("----------get-----------");
        System.out.println(localDate.getDayOfMonth());
        System.out.println(localDate.getDayOfWeek());
        System.out.println(localDate.getDayOfYear());
        System.out.println(now.getMonthValue());
        System.out.println(now.getMonth());
        System.out.println("----------parse--------");
        //parse將字串轉換成LocalDate物件
        String strLocalDate="2001-02-02";
        LocalDate myLocalDate=LocalDate.parse(strLocalDate);
        System.out.println(myLocalDate);
    }
}

4、LocalTime

LocalDate類只表示日期,JDK8中定義了新類LocalTime用來表示時間

import java.time.LocalTime;
import java.time.temporal.ChronoField;
/**
 * ChronoField是java8提供的一個列舉類
 * 裡面定義了很多表示日曆的欄位
 * 提供基於欄位的訪問來操縱日期,時間或日期時間,
 * 通過實現TemporalField來擴充套件標準欄位集
 */
public class LocalTimeTest {
    public static void main(String[] args) {
        System.out.println("---獲取LocalTime物件---");
        //now()  用當前日期生成LocalTime
        LocalTime now = LocalTime.now();
        System.out.println(now);
        //of()  使用指定數字生成LocalTime
        LocalTime of = LocalTime.of(11, 2, 35, 231);
        System.out.println(of);
        System.out.println("------返回各欄位值------");
        System.out.println(now.getHour());
        System.out.println(now.getMinute());
        System.out.println(now.getSecond());
        System.out.println(now.get(ChronoField.HOUR_OF_DAY));//在標準的24小時數字時鐘上觀察到的小時
        System.out.println(now.get(ChronoField.MINUTE_OF_HOUR));
        System.out.println(now.get(ChronoField.SECOND_OF_MINUTE));
        System.out.println("----------parse--------");
        //parse,引數格式 HH:mm:ss  將字串轉換成LocalTime物件
        LocalTime parseLocalTime = LocalTime.parse("12:02:38");
        System.out.println(parseLocalTime);
    }
}

5、LocalDateTime

LocalDateTime類,同時包含日期與時間

import java.time.LocalDateTime;
public class LocalDateTimeTest {
    public static void main(String[] args) {
        System.out.println("---獲取LocalDateTime物件---");
        //now()  當前日期
        LocalDateTime now=LocalDateTime.now();
        System.out.println(now);
        //of()  指定數字 年月日時分秒
        LocalDateTime of=LocalDateTime.of(2001,4,25,14,23,45);
        System.out.println(of);
        System.out.println(now.getDayOfMonth());
        System.out.println(now.getHour());
        //parse預設格式:yyyy-MM-ddTHH:mm:ss
        LocalDateTime parse=LocalDateTime.parse("2001-02-02T12:34:23");
        System.out.println(parse);
    }
}

6、DateTimeFormatter

對於格式化及解析

//ofPattern靜態方法獲取DateTimeFormatter物件
DateTimeFormatter dtf=DateTimeFormatter.ofPattern("yyyy年MM月dd日HH時mm分ss秒");
//獲取localDateTime物件
LocalDateTime now=LocalDateTime.now();
//LocalDate now =LocalDate.now();//只表示日期沒有時間,不匹配
//把LocalDateTime LocalDate LocalTime 按照指定格式轉換成字串
//DateTimeFormatter格式要與format引數一致
String format=dtf.format(now);
System.out.println(format);
/*2022年04月10日15時42分52秒*/

7、LocalDate、LocalTime、LocalDateTime

  • 使用DateTimeFormatter物件進行格式化
  • 使用DateTimeFormatter物件把字串按照指定的格式轉換成時間日期型別物件
  • String pattern1="yyyy/MM/dd";
    DateTimeFormatter dtf1=DateTimeFormatter.ofPattern(pattern1);
    TemporalAccessor parse = LocalDate.parse("2001/02/02",dtf1);
    System.out.println(parse);
    
    String pattern2="yyyy/MM/dd HH:mm:ss";
    DateTimeFormatter dtf2 = DateTimeFormatter.ofPattern(pattern2);
    LocalDateTime localDateTime=LocalDateTime.parse("2002/04/02 14:23:34",dtf2);
    System.out.println(localDateTime);
    
    String pattern3="HH:mm:ss";
    DateTimeFormatter dtf3 = DateTimeFormatter.ofPattern(pattern3);
    LocalTime localTime=LocalTime.parse("14:23:34",dtf3);
    System.out.println(localTime);