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); } }