Home | 简体中文 | 繁体中文 | 杂文 | Github | 知乎专栏 | Facebook | Linkedin | Youtube | 打赏(Donations) | About
知乎专栏

3.5. Date 日期时间

java.util.Date, java.sql.Date, java.sql.Time, java.sql.Timestamp 区别

3.5.1. String to Date

		
package cn.netkiller.java.date;

/**
 * Hello world!
 *
 */
public class App {
	public static void main(String[] args) {
		System.out.println("Hello World!");

		// Get standard date and time
		java.util.Date utilDate = new java.util.Date();
		long javaTime = utilDate.getTime();
		System.out.println("The Java Date is:" + utilDate.toString());

		// Get and display SQL DATE
		java.sql.Date sqlDate = new java.sql.Date(javaTime);
		System.out.println("The SQL DATE is: " + sqlDate.toString());

		// Get and display SQL TIME
		java.sql.Time sqlTime = new java.sql.Time(javaTime);
		System.out.println("The SQL TIME is: " + sqlTime.toString());
		
		// Get and display SQL TIMESTAMP
		java.sql.Timestamp sqlTimestamp = new java.sql.Timestamp(javaTime);
		System.out.println("The SQL TIMESTAMP is: " + sqlTimestamp.toString());
	}
}

		
			
		
The Java Date is:Thu Aug 24 16:51:57 CST 2017
The SQL DATE is: 2017-08-24
The SQL TIME is: 16:51:57
The SQL TIMESTAMP is: 2017-08-24 16:51:57.234		
		
			
			
        Date currentDate = new Date();
        int month = currentDate.getMonth() + 1;
        System.out.println("当前月份为:" + month);			
			
			

3.5.2. DateTimeFormatter 格式化日期和时间

			
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
 
public class Main {
    public static void main(String[] args) {
        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
        LocalDateTime dateTime = LocalDateTime.now();
        String formattedDateTime = dateTime.format(formatter);
        System.out.println(formattedDateTime);
    }
}
			
			
			
        DateTimeFormatter dtf = DateTimeFormatter.ofPattern("B");
        System.out.println(dtf.format(LocalTime.of(8, 0)));
        System.out.println(dtf.format(LocalTime.of(13, 0)));
        System.out.println(dtf.format(LocalTime.of(20, 0)));
        System.out.println(dtf.format(LocalTime.of(23, 0)));
        System.out.println(dtf.format(LocalTime.of(0, 0)));			
			
			

			
上午
下午
晚上
晚上
午夜			
			
			

Data 转 LocalDate

			
		Date date = new Date();​
        ​
        // 1. 将Date转换为LocalDate(需指定时区,避免默认时区差异)​
        LocalDate localDate = date.toInstant()​
                                 .atZone(ZoneId.systemDefault()) // 系统默认时区(如Asia/Shanghai)​
                                 .toLocalDate();​
        ​
        // 2. 定义格式化器:YYYY-MM-DD​
        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd");​
        ​
        // 3. 转换为字符串​
        String dateStr = localDate.format(formatter);			
			
			

3.5.3. SimpleDateFormat 格式化日期和时间

字符串转日期

			
        try {

            DateFormat df = new SimpleDateFormat("yyyy-MM-dd");
            String str = "2018-12-11";
            Date date = df.parse(str);
            System.out.println(date);

        } catch (Exception e) {
            e.printStackTrace();
        }			
			
			
			
package cn.netkiller.example;

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

public class StringToDate {

	public StringToDate() {
		// TODO Auto-generated constructor stub
	}

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
		String dateString = "2008-8-8 8:8:8";

		try {

			Date date = formatter.parse(dateString);
			System.out.println(date);
			System.out.println(formatter.format(date));

		} catch (ParseException e) {
			e.printStackTrace();
		}
	}

}			
			
			
			

public static void main(String[] args) {

	DateFormat dateFormat = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss");
	//get current date time with Date()
	Date date = new Date();
	System.out.println(dateFormat.format(date));
	
	//get current date time with Calendar()
	Calendar cal = Calendar.getInstance();
	System.out.println(dateFormat.format(cal.getTime()));

}
			
			

不规范的 RFC3339 日期

			
		String dt = "2021-08-26T09:17:23.859291804+08:00";
		String rfc3339 = dt.replaceAll("\\.([0-9]+)", "");
		System.out.println(dt);
		System.out.println(rfc3339);
		SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssXXX");
		simpleDateFormat.setTimeZone(TimeZone.getTimeZone("GMT+8"));
		System.out.println(simpleDateFormat.parse(rfc3339).toLocaleString());			
			
			

3.5.3.1. compareTo() 比较日志

				
String beginTime = "2015-05-20 13:12:30";
String endTime = "2015-07-15 10:20:12";
 
SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
 
try {
	Date date1 = format.parse(beginTime);
	Date date2 = format.parse(endTime);
	
	int compareTo = date1.compareTo(date2);
	
	System.out.println(compareTo);
	
} catch (ParseException e) {
	e.printStackTrace();
}
				
				
				

3.5.3.2. before() / after()

				
String beginTime = "2015-05-20 13:12:30";
String endTime = "2015-07-15 10:20:12";
 
SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
 
try {
	Date date1 = format.parse(beginTime);
	Date date2 = format.parse(endTime);
	
	boolean before = date1.before(date2);
	
	System.out.println(before);
	
} catch (ParseException e) {
	e.printStackTrace();
}

				
				

3.5.3.3. 

				
String beginTime = "2015-05-20 13:12:30";
String endTime = "2015-07-15 10:20:12";
 
SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
 
try {
	Date date1 = format.parse(beginTime);
	Date date2 = format.parse(endTime);
	
	long beginMillisecond = date1.getTime();
	long endMillisecond = date2.getTime();
	
	System.out.println(beginMillisecond > endMillisecond);
	
} catch (ParseException e) {
	e.printStackTrace();
}
				
				

3.5.4. Timestamp

			
Timestamp timestamp = new Timestamp(System.currentTimeMillis());

Date date = new Date();
Timestamp timestamp = new Timestamp(date.getTime());
			
			
			

3.5.5. TimeZone

			
package cn.netkiller.example;

import java.sql.Timestamp;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.GregorianCalendar;
import java.util.TimeZone;

public class TimeZoneTest {
	
	public TimeZoneTest() {
		// TODO Auto-generated constructor stub
	}
	
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		
		SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
		
		TimeZone timeZone = TimeZone.getTimeZone("Asia/Harbin");
		
		Date date = new Date();
		Timestamp timestamp = new Timestamp(date.getTime());
		
		System.out.println(timestamp);
		
		timestamp.setHours(timestamp.getHours()+8);
		System.out.println(timestamp);
		
		simpleDateFormat.setTimeZone(TimeZone.getTimeZone("GMT"));
		System.out.println(simpleDateFormat.format(date));
		
		simpleDateFormat.setTimeZone(TimeZone.getTimeZone("Asia/Harbin"));
		System.out.println(simpleDateFormat.format(date));
		
		Calendar calendar = new GregorianCalendar();
		calendar.setTime(date);
		calendar.setTimeZone(timeZone);
		System.out.println(simpleDateFormat.format(calendar.getTime()));
	}

}
			
			

3.5.6. 比较两个日期与时间

			
package cn.netkiller.example;

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

public class DateCompare {

	public DateCompare() {
		// TODO Auto-generated constructor stub
	}

	public void fun1() throws InterruptedException {
		Date d1 = new Date();
		Thread.sleep(5000);
		Date d2 = new Date();
		if (d1.before(d2)) {
			System.out.println(String.format("%s < %s", d1.toString(), d2.toString()));
		} else {
			System.out.println(String.format("%s > %s", d1.toString(), d2.toString()));
		}
		if (d2.after(d1)) {
			System.out.println(String.format("%s > %s", d2.toString(), d1.toString()));
		}

		System.out.println(String.format("%s : %s => %d", d2.toString(), d1.toString(), d1.compareTo(d2)));
		System.out.println(String.format("%s : %s => %d", d1.toString(), d2.toString(), d2.compareTo(d1)));
	}

	public void fun2() throws InterruptedException {

		DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");

		Date date1 = new Date();
		Date date2 = new Date();
		String s1 = dateFormat.format(date1);
		String s2 = dateFormat.format(date2);
		System.out.println(String.format("%s : %s => %d", s1, s2, s1.compareTo(s2)));

		date1 = new Date();
		Thread.sleep(5000);
		date2 = new Date();
		s1 = dateFormat.format(date1);
		s2 = dateFormat.format(date2);
		System.out.println(String.format("%s : %s => %d", s1, s2, s1.compareTo(s2)));
		System.out.println(String.format("%s : %s => %d", s2, s1, s2.compareTo(s1)));
		System.out.println();
	}

	public void fun3() throws InterruptedException, ParseException {
		DateFormat formatter = new SimpleDateFormat("yyyy-MM-dd HH:mm");
		//Date time = formatter.parse("2016-09-27 16:29");
		Date time = formatter.parse("2016-08-09 09:15");
		Date startDate = formatter.parse("2016-08-09 09:15");
		Date endDate = formatter.parse("2016-09-27 16:30");
		
		if (time.before(startDate) || time.after(endDate)) {
			System.out.println("Skip");
		}
	}

	public static void main(String[] args) throws InterruptedException {
		// TODO Auto-generated method stub
		DateCompare dateCompare = new DateCompare();
		dateCompare.fun1();
		System.out.println();
		dateCompare.fun2();
		System.out.println();
		dateCompare.fun3();
	}

}
			
			

3.5.7. Calendar

				
		Calendar cal = Calendar.getInstance();
		int year = cal.get(Calendar.YEAR);
		int month = cal.get(Calendar.MONTH )+1;
		
		System.out.println(year + "年 " + month + "月");
			
			

3.5.7.1. 日期加法操作

				
//获取当前日期
Date date = new Date();
 
//创建Calendar实例
Calendar cal = Calendar.getInstance();
cal.setTime(date);   //设置当前时间
cal.add(Calendar.YEAR, 1);  //在当前时间基础上加一年
 
//将时间格式化成yyyy-MM-dd HH:mm:ss的格式
SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
System.out.println(format.format(cal.getTime()));
 
 
 
//同理增加一个月和一天的方法:
cal.add(Calendar.MONTH, 1);
cal.add(Calendar.DAY, 1);				
				
				

3.5.7.2. 计算起始日期与终止日期之间的月份

				
        Calendar calendar = Calendar.getInstance();
        SimpleDateFormat format = new SimpleDateFormat("yyyy-MM");

        Date d1 = new SimpleDateFormat("yyyy-MM").parse("2020-02-01");//定义起始日期
        Date d2 = new SimpleDateFormat("yyyy-MM").parse("2024-03-02");//定义结束日期

        calendar.setTime(d2);
        calendar.add(Calendar.MONTH, 1);
        d2 = calendar.getTime();

        calendar.setTime(d1);//设置日期起始时间

        while (calendar.getTime().before(d2)) {//判断是否到结束日期

            SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM");
            String str = sdf.format(calendar.getTime());
            System.out.println(str);//输出日期结果
            calendar.add(Calendar.MONTH, 1);//进行当前日期月份加1
        }				
				
				
				
private List<Date> getMonthRange(String startDate, String endDate) {
        List<Date> monthList = new ArrayList<>();
        Calendar calendar = Calendar.getInstance();
        SimpleDateFormat format = new SimpleDateFormat("yyyy-MM");

        try {


            Date d1 = new SimpleDateFormat("yyyy-MM").parse(startDate);//定义起始日期
            Date d2 = new SimpleDateFormat("yyyy-MM").parse(endDate);//定义结束日期

            calendar.setTime(d2);
            calendar.add(Calendar.MONTH, 1);
            d2 = calendar.getTime();

            calendar.setTime(d1);//设置日期起始时间

            while (calendar.getTime().before(d2)) {//判断是否到结束日期
                monthList.add(calendar.getTime());
//            SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM");
//            String str = sdf.format(calendar.getTime());
//            System.out.println(str);//输出日期结果
                calendar.add(Calendar.MONTH, 1);//进行当前日期月份加1
            }
        } catch (ParseException e) {

        }
        return monthList;

    }				
				
				

3.5.7.3. 取日期范围

				
        Calendar calendar = Calendar.getInstance();
        SimpleDateFormat format = new SimpleDateFormat("yyyy-MM");

        Date d1 = new SimpleDateFormat("yyyy-MM-dd").parse("2024-03-10");//定义起始日期
        Date d2 = new SimpleDateFormat("yyyy-MM-dd").parse("2024-03-20");//定义结束日期

        calendar.setTime(d2);
        calendar.add(Calendar.DATE, 1);
        d2 = calendar.getTime();

        calendar.setTime(d1);//设置日期起始时间

        while (calendar.getTime().before(d2)) {//判断是否到结束日期

            SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
            String str = sdf.format(calendar.getTime());
            System.out.println(str);//输出日期结果
            calendar.add(Calendar.DATE, 1);//进行当前日期月份加1
        }				
				
				

3.5.8. getToday

			
	public Date getToday(String time) {
		final Calendar cal = Calendar.getInstance();
		DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd " + time);
		DateFormat fmt = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
		Date date = null;
		try {
			date = fmt.parse(dateFormat.format(cal.getTime()));
		} catch (ParseException e) {
			e.printStackTrace();
		}
		return date;
	}

	private Date addOneDay(Date date, int day) {
		Calendar cal = Calendar.getInstance();
		cal.setTime(date);
		cal.add(Calendar.DATE, day);
		return cal.getTime();
	}
			
			

3.5.9. Yesterday

					
package cn.netkiller.date;

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

public class Yesterday {

	public Yesterday() {
		// TODO Auto-generated constructor stub
	}

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Yesterday yesterday = new Yesterday();
		System.out.println(yesterday.yesterday());
		System.out.println(yesterday.getYesterday("00:00:00"));
		System.out.println(yesterday.getYesterday("23:59:59"));
	}
	private Date yesterday() {
	    final Calendar cal = Calendar.getInstance();
	    cal.add(Calendar.DATE, -1);
	    return cal.getTime();
	}

	private Date getYesterday(String time) {
	        DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd "+time);
	        
	        DateFormat fmt =new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
	        Date date = null;
	        try {
	            date = fmt.parse(dateFormat.format(yesterday()));
	        } catch (ParseException e) {
	            e.printStackTrace();
	        }
	        return date;
	}
}
		

			

3.5.10. ISO 8601

			
ISO 8601扩展格式 YYYY-MM-DDTHH:mm:ss.sssZ
			
			

3.5.11. LocalDateTime

			
	LocalDateTime localDateTime = LocalDateTime.of(2016, 1, 1, 13, 55);
	ZonedDateTime zonedDateTime = localDateTime.atZone(ZoneId.of("Asia/Shanghai"));
	Date date = Date.from(zonedDateTime.toInstant());	
		
	Instant instant = Instant.ofEpochMilli(date.getTime());
    LocalDateTime ldt = LocalDateTime.ofInstant(instant, ZoneOffset.UTC);
    Instant instant = ldt.toInstant(ZoneOffset.UTC);
    Date date = Date.from(instant);		
				
			
			

时间比较

			
import java.time.LocalDateTime;

public class LocalDateTimeCompareDemo {
    public static void main(String[] args) {
        // 构建两个 LocalDateTime 实例(方式:of() 或 parse())
        LocalDateTime time1 = LocalDateTime.of(2025, 11, 4, 10, 30, 0); // 2025-11-04 10:30:00
        LocalDateTime time2 = LocalDateTime.parse("2025-11-04T14:20:00"); // 2025-11-04 14:20:00
        LocalDateTime time3 = LocalDateTime.of(2025, 11, 4, 10, 30, 0); // 与 time1 相等

        // 1. isBefore():是否在之前
        boolean before = time1.isBefore(time2);
        System.out.println("time1 在 time2 之前?" + before); // true

        // 2. isAfter():是否在之后
        boolean after = time2.isAfter(time1);
        System.out.println("time2 在 time1 之后?" + after); // true

        // 3. isEqual():是否相等(精确到纳秒,年月日时分秒纳秒完全一致)
        boolean equal = time1.isEqual(time3);
        System.out.println("time1 与 time3 相等?" + equal); // true

        // 4. compareTo():比较(返回 int,支持排序)
        int compare1 = time1.compareTo(time2); // time1 < time2 → 返回负数(-1)
        int compare2 = time2.compareTo(time1); // time2 > time1 → 返回正数(1)
        int compare3 = time1.compareTo(time3); // 相等 → 返回 0
        System.out.println("time1.compareTo(time2):" + compare1); // -1
        System.out.println("time2.compareTo(time1):" + compare2); // 1
        System.out.println("time1.compareTo(time3):" + compare3); // 0
    }
}			
			
			

去一个日期范围

			
package cn.netkiller.test;

import java.time.LocalDateTime;

public class Test {
    public static void main(String[] args) {

        LocalDateTime afterTime = LocalDateTime.now().minusHours(1);
        LocalDateTime beforeTime = LocalDateTime.now().minusMinutes(10);
        System.out.printf("%s ~ %s", afterTime, beforeTime);

    }

}			
			
			

3.5.12. Duration

			
import java.time.Duration;

public class SecondsToMillisecondsWithDuration {
    public static void main(String[] args) {
        // 1. 整数秒转换
        int seconds1 = 10;
        // 通过 Duration.ofSeconds() 创建对应秒数的 Duration 对象
        Duration duration1 = Duration.ofSeconds(seconds1);
        // 调用 toMillis() 方法获取毫秒数
        long millis1 = duration1.toMillis();
        System.out.println(seconds1 + " 秒 = " + millis1 + " 毫秒"); // 输出:10 秒 = 10000 毫秒

        // 2. 带纳秒的秒数转换(支持更精确的小数秒)
        long seconds2 = 3; // 秒数整数部分
        int nanos = 500_000_000; // 纳秒部分(500毫秒 = 500,000,000纳秒)
        Duration duration2 = Duration.ofSeconds(seconds2, nanos);
        long millis2 = duration2.toMillis();
        System.out.println(seconds2 + "秒 + " + nanos + "纳秒 = " + millis2 + " 毫秒"); // 输出:3秒 + 500000000纳秒 = 3500 毫秒

        // 3. 处理大数值秒数
        long seconds3 = 3_600_000; // 1000小时对应的秒数
        Duration duration3 = Duration.ofSeconds(seconds3);
        long millis3 = duration3.toMillis();
        System.out.println(seconds3 + " 秒 = " + millis3 + " 毫秒"); // 输出:3600000 秒 = 3600000000 毫秒
    }
}			
			
			

100000 毫秒 → 格式化为 00:10(分:秒)

			
import java.time.Duration;

public static String formatMsToMinSec(long milliseconds) {
    Duration duration = Duration.ofMillis(milliseconds);
    long minutes = duration.toMinutes();
    long seconds = duration.minusMinutes(minutes).getSeconds();
    

    
    // 格式化成 00:00
    return String.format("%02d:%02d", minutes, seconds);
}
			
			
    String time = String.format("请求频率太频繁,请 %02d:%02d 后重试",
                        Duration.ofMillis(expire).toMinutes(),
                        Duration.ofMillis(expire).toSecondsPart()
	);		

Duration d = Duration.ofSeconds(100);
String time = String.format("%02d:%02d", d.toMinutesPart(), d.toSecondsPart());

                	
			
			

3.5.13. 计算流逝时间

			
package com.netkiller.conference.ai.utils;

import android.os.Build;

import androidx.annotation.RequiresApi;

import java.time.Duration;
import java.time.LocalDateTime;

public class Datatime {
    
    public static String elapsed(LocalDateTime startTime, LocalDateTime endTime) {
        Duration duration = Duration.between(startTime, endTime);
        long hours = duration.toHours();
        long minutes = duration.toMinutesPart();
        long seconds = duration.toSecondsPart();
        long millis = duration.toMillisPart();

        if (hours > 0) {
//            return String.format("%d 时 %d 分 %d 秒 %d 毫秒", hours, minutes, seconds, millis);
            return String.format("%02d:%02d:%02d", hours, minutes, seconds);
        } else if (minutes > 0) {
//            return String.format("%d 分 %d 秒 %d 毫秒", minutes, seconds, millis);
            return String.format("%02d:%02d", minutes, seconds);
        } else if (seconds > 0) {
//            return String.format("%d 秒 %d 毫秒", seconds, millis);
            return String.format("00:%02d", seconds);
        } else {
//            return String.format("%d 毫秒", millis);
            return "00:00";
        }
    }
}