平常开发过程当中,我们可能会见到有的日期格式是这样的。
1、2022-12-21T12:20:16+08:00
2、2022-12-21T12:20:16.000+0800
3、2022-12-21T12:20:16.000+08:00
下面来说一下这种时间格式怎么转换
第一种:2022-12-21T12:20:16+08:00
代码如下:
public static void main(String[] args) throws ParseException {
SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
String dateStr = "2022-12-21 12:20:16";
Date date = dateFormat.parse(dateStr);
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssXXX");
String format = sdf.format(date);
System.out.println(format);
}
第二种:2022-12-21T12:20:16.000+0800
代码如下:
public static void main(String[] args) throws ParseException {
SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
String dateStr = "2022-12-21 12:20:16";
Date date = dateFormat.parse(dateStr);
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSZ");
String format = sdf.format(date);
System.out.println(format);
}
第三种:2022-12-21T12:20:16.000+08:00
代码如下
public static void main(String[] args) throws ParseException {
SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
String dateStr = "2022-12-21 12:20:16";
Date date = dateFormat.parse(dateStr);
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSXXX");
String format = sdf.format(date);
System.out.println(format);
}
上面三种都是用 SimpleDateFormat 实现的。SimpleDateFormat不是线程安全的。
因此,我们可以用DateTimeFormatter ,这是线程安全的。
并且DateTimeFormatter 是java8当中引入的,比前者更加灵活。你值得拥有。
public static void main(String[] args) {
DateTimeFormatter formatter1 = DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm:ss.SSSZ");
DateTimeFormatter formatter2 = DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm:ssXXX");
DateTimeFormatter formatter3 = DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm:ss.SSSXXX");
LocalDateTime now = LocalDateTime.now();
// 2023-07-29T14:43:57.431+0800
String value1 = now.atZone(ZoneId.systemDefault()).format(formatter1);
System.out.println(value1);
// 2023-07-29T14:43:57+08:00
String value2 = now.atZone(ZoneId.systemDefault()).format(formatter2);
System.out.println(value2);
// 2023-07-29T14:58:12.023+08:00
String value3 = now.atZone(ZoneId.systemDefault()).format(formatter3);
System.out.println(value3);
}
为什么说DateTimeFormatter是线程安全的?
这里附上部分源码。
DateTimeFormatter类 以及内部的常量 都是使用final关键字修饰的,是不可变的。