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 ThreadLocalthreadLocal = new ThreadLocal () { @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); }}