本文主要介绍Java中,使用SimpleDateFormat和DateTimeFormatter的方法来格式化日期和时间的方法,以及实现的示例代码。

1、SimpleDateFormat和DateTimeFormatter用法及区别

使用SimpleDateFormat,应该只格式化旧的日期时间类型,如java.util.Date。需要格式化java.time日期时间类型,需要使用DateTimeFormatter

Java8的DateTimeFormatter是线程安全的,而SimpleDateFormat不是线程安全。

1)SimpleDateFormat的使用

//第一种用法
public static String formatDate(Date date) throws ParseException { 
	SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); 
	return sdf.format(date); 
}
//第二种用法
private static SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); 
public static String formatDate(Date date) throws ParseException { 
	synchronized(sdf) { 
		return sdf.format(date); 
	} 
}
//第三种用法(推荐)
//可以使用ThreadLocal来限制SimpleDateFormat只能在线程内共享,避免了多线程导致的线程安全问题。较好的解决并发问题
private static ThreadLocal<DateFormat> threadLocal = new ThreadLocal<DateFormat>() { 
	@Override 
	protected DateFormat initialValue() { 
		return new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); 
	} 
};
public static String format(Date date) { 
	return threadLocal.get().format(date); 
}

2)SimpleDateFormat的使用

//解析日期
String dateStr= "2021年10月14日"; 
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy年MM月dd日");   
LocalDate date= LocalDate.parse(dateStr, formatter);
//日期转换为字符串
LocalDateTime now = LocalDateTime.now(); 
DateTimeFormatter format = DateTimeFormatter.ofPattern("yyyy年MM月dd日 hh:mm a"); 
String nowStr = now .format(format);

2、SimpleDateFormat和DateTimeFormatter格式化日期时间

import java.time.LocalDate;
import java.time.Period;
import java.time.ZoneOffset;
import java.time.format.DateTimeFormatter;
import java.util.Random;
public class Main {
    public static void main(String[] args) {
        System.out.println(generateRandomDateAndTimeInString());
    }
    public static String generateRandomDateAndTimeInString() {
        LocalDate date = LocalDate.now().minus(Period.ofDays((new Random().nextInt(365 * 70))));
        System.out.println("date and time :: " + date.toString());
        return formatDate(date);
    }
    public static String formatDate(LocalDate date) {
        DateTimeFormatter dtf = DateTimeFormatter.ofPattern("uuuu-MM-dd'T'HH:mm:ssX");
        // return date.atStartOfDay().atOffset(ZoneOffset.UTC).toString();
        return date.atStartOfDay().atOffset(ZoneOffset.UTC).format(dtf);
    }
}

或者

import java.time.LocalDate;
import java.time.Period;
import java.time.ZoneOffset;
import java.time.format.DateTimeFormatter;
import java.util.Random;
public class Main {
    public static void main(String[] args) {
        System.out.println(generateRandomDateAndTimeInString());
    }
    public static String generateRandomDateAndTimeInString() {
        LocalDate date = LocalDate.now().minus(Period.ofDays((new Random().nextInt(365 * 70))));
        System.out.println("date and time :: " + date.toString());
        return formatDate(date);
    }
   public static String formatDate(LocalDate date) {
    Date utilDate = Date.from(date.atStartOfDay(ZoneOffset.UTC).toInstant());
    DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssX");
    return dateFormat.format(utilDate);
   }
}


推荐文档