格式化输出
java8及以上(Java8+) 主要用DateTimeFormatter,它自带了一些格式(如DateTimeFormatter formatter = DateTimeFormatter.ISO_OFFSET_DATE_TIME;
) , 不过我们可以自己自定义,满足不同需求。
java8以下主要用SimpleDateFormat, 当然java8+也可以用, 但是java8+推荐用DateTimeFormatter
- DateTimeFormatter
主要格式化参数:
字母 | 含义 | 示例 |
---|---|---|
y | 年(Year) | yyyy → 2023, yy → 23 |
M | 月(Month) | M → 9, MM → 09, MMM → Sep, MMMM → September |
d | 月中的天数(Day of month) | d → 5, dd → 05 |
H | 小时(24小时制,0-23) | H → 13, HH → 13 |
h | 小时(12小时制,1-12) | h → 1, hh → 01 |
a | 上午/下午(AM/PM) | a → AM, a → PM |
m | 分钟(Minute) | m → 30, mm → 30 |
s | 秒(Second) | s → 45, ss → 45 |
E | 星期几(Day of week) | E → Mon, EEEE → Monday |
z | 时区名称(Time zone name) | z → CST, zzzz → China Standard Time |
Z | 时区偏移量(RFC 822) | Z → +0800 |
X | 时区偏移量(ISO 8601) | X → +08, XX → +0800, XXX → +08:00 |
V | 时区 ID(Zone ID) | V → America/New_York |
- SimpleDateFormat
SimpleDateFormat的格式化参数和DateTimeFormatter 差不多。
- 将时间显示为如 2000/01/02 03:44:55 星期一, 01-02 03:44, 2000-01-02 03:44
(1) 平台等于大于Java8 (Java8+) 推荐用DateTimeFormatter
// 时间格式化示例
public class ATest {
public static void main(String[] args) {
// 这里模拟一个时间: 2000-01-02 03:44:55
LocalDateTime dateTime = LocalDateTime.of(2000, 1, 2, 3, 44, 55, 0);
// 定义格式化器
DateTimeFormatter formatter1 = DateTimeFormatter.ofPattern("yyyy/MM/dd HH:mm:ss E");
DateTimeFormatter formatter2 = DateTimeFormatter.ofPattern("yyyy/MM/dd HH:mm:ss");
DateTimeFormatter formatter3 = DateTimeFormatter.ofPattern("MM-dd HH:mm");
// 格式化输出
String output1 = dateTime.format(formatter1);
System.out.println("格式1: " + output1); // 格式1: 2000/01/02 03:44:55 周日
String output2 = dateTime.format(formatter2);
String weekdayStr = getWeekdayName(dateTime.getDayOfWeek().getValue());
output2 += " " + weekdayStr;
System.out.println("格式2: " + output2); // 格式2: 2000/01/02 03:44:55 星期日
String output3 = dateTime.format(formatter3);
System.out.println("格式3: " + output3); // 格式3: 01-02 03:44
// 如果是 ZonedDateTime, 有时区信息,所以可以输出时区信息
ZonedDateTime zonedDateTime = dateTime.atZone(ZoneId.systemDefault());
DateTimeFormatter formatter4 = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm zzzz");
String output4 = zonedDateTime.format(formatter4);
System.out.println("格式4: " + output4); // 格式4: 2000-01-02 03:44 中国标准时间
}
private static String getWeekdayName(int dayOfWeek) {
switch (dayOfWeek) {
case 1:
return "星期一";
case 2:
return "星期二";
case 3:
return "星期三";
case 4:
return "星期四";
case 5:
return "星期五";
case 6:
return "星期六";
case 7:
return "星期日";
default:
return "未知";
}
}
}
(2) 所有Java版本都能用
// 时间格式化示例
public class ATest {
public static void main(String[] args) {
// 这里模拟一个时间: 2000-01-02 03:44:55
Calendar calendar = Calendar.getInstance();
calendar.set(2000, 0, 2, 3, 44, 55);
Date date = calendar.getTime();
// 定义格式化器
SimpleDateFormat formatter1 = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss E");
SimpleDateFormat formatter2 = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss");
SimpleDateFormat formatter3 = new SimpleDateFormat("MM-dd HH:mm");
// 格式化输出
String output1 = formatter1.format(date);
System.out.println("格式1: " + output1); // 格式1: 2000/01/02 03:44:55 周日
String output2 = formatter2.format(date);
String weekdayStr = getWeekdayName(calendar.get(Calendar.DAY_OF_WEEK));
output2 += " " + weekdayStr;
System.out.println("格式2: " + output2); // 格式2: 2000/01/02 03:44:55 星期日
String output3 = formatter3.format(date);
System.out.println("格式3: " + output3); //格式3: 01-02 03:44
// 如果需要输出时区信息
SimpleDateFormat formatter4 = new SimpleDateFormat("yyyy-MM-dd HH:mm zzzz");
String output4 = formatter4.format(date);
System.out.println("格式4: " + output4); // 格式4: 2000-01-02 03:44 中国标准时间
}
// 将数字转换为星期几的名称
private static String getWeekdayName(int dayOfWeek) {
switch (dayOfWeek) {
case Calendar.SUNDAY:
return "星期日";
case Calendar.MONDAY:
return "星期一";
case Calendar.TUESDAY:
return "星期二";
case Calendar.WEDNESDAY:
return "星期三";
case Calendar.THURSDAY:
return "星期四";
case Calendar.FRIDAY:
return "星期五";
case Calendar.SATURDAY:
return "星期六";
default:
return "未知";
}
}
}
从字符串解析日期
-
没有时区信息的情况: 将字符串 "2000-01-01 22:33:55"转为日期
(1) Java8+
// 字符串转为日期对象 String dateStr = "2000-01-02 03:44:55"; // 定义日期时间格式 DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"); // 解析字符串为 LocalDateTime LocalDateTime dateTime = LocalDateTime.parse(dateStr, formatter); System.out.println("解析后的时间: " + dateTime); //解析后的时间: 2000-01-02T03:44:55 int year = dateTime.getYear(); int month = dateTime.getMonthValue(); int day = dateTime.getDayOfMonth(); int hour = dateTime.getHour(); int minute = dateTime.getMinute(); int sec = dateTime.getSecond(); // Output: 2000-1-2 3:44:55 System.out.println(year + "-" + month + "-" + day + " " + hour + ":" + minute + ":" + sec);
(2) 所有Java版本都适用
// 字符串转为日期对象 String dateStr="2000-01-02 03:44:55"; // 假如dateStr="2000-01-01 22:33:55.123" 也能解析, 信息只能多不能少, // 如dateStr="2000-01-01T22:33:55.123", // 则 SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss") SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); // 解析字符串为 Date 对象 Date date = null; try { date = format.parse(dateStr); } catch (ParseException e) { throw new RuntimeException(e); } // Output: 解析后的时间: 2000-01-02 03:44:55 System.out.println("解析后的时间: " + format.format(date)); Calendar calendar = Calendar.getInstance(); calendar.setTime(date); int year = calendar.get(Calendar.YEAR); int month = calendar.get(Calendar.MONTH) + 1; int day = calendar.get(Calendar.DAY_OF_MONTH); int hour = calendar.get(Calendar.HOUR_OF_DAY); int minute = calendar.get(Calendar.MINUTE); int sec = calendar.get(Calendar.SECOND); // Output: 2000-1-2 3:44:55 System.out.println(year + "-" + month + "-" + day + " " + hour + ":" + minute + ":" + sec);
-
有时区信息的情况: 将字符串 "2000-01-01T22:33:55.123Z"或"2000-01-01T22:33:55.123+02:00"转为本地时区时间显示
(1) Java8+
// 解析有时区信息的时间字符串
// String dateStr = "2020-01-02T03:44:55.123+02:00";
// Z代表UTC时间,北京时间是UTC+8小时 (+08:00)
String dateStr = "2020-01-02T03:44:55.123Z";
// XXX 这个是控制时区显示格式的
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm:ss.SSSXXX");
// 也可用ZonedDateTime, OffsetDateTime只记录时区偏移,比如+8小时, 用法跟ZonedDateTime差不多
// ZonedDateTime要记录更多信息,比如时区规则(如 Asia/Shanghai),可以处理夏令时等复杂时区问题
// ZonedDateTime zonedDateTime = ZonedDateTime.parse(dateStr, formatter);
// System.out.println(zonedDateTime);
// 解析带时区的时间
OffsetDateTime offsetDateTime = OffsetDateTime.parse(dateStr);
System.out.println(offsetDateTime); // 2020-01-02T03:44:55.123Z
// 转换为本地时区时间, (测试机器的时区是北京时间的时区)
LocalDateTime localDateTime = offsetDateTime.atZoneSameInstant(ZoneId.systemDefault()).toLocalDateTime();
// 格式化输出
DateTimeFormatter formatter1 = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
System.out.println(localDateTime.format(formatter1)); // 2020-01-02 11:44:55
(2) 所有Java版本都适用
// 解析有时区信息的时间字符串
// String dateStr = "2020-01-02T03:44:55.123+02:00";
// Z代表UTC时间,北京时间是UTC+8小时 (+08:00)
String dateStr = "2020-01-02T03:44:55.123Z";
SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSXXX");
Date date = null;
try {
date = format.parse(dateStr);
} catch (ParseException e) {
throw new RuntimeException(e);
}
// 转换为本地时区格式
SimpleDateFormat localFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
// 可以不用设置,因为默认就是本地的时区
// localFormat.setTimeZone(TimeZone.getDefault()); // 使用本地时区
String localTime = localFormat.format(date);
System.out.println(localTime); // Output: 2020-01-02 11:44:55