Java知识点--DataFormat,SimpleDateFormat和DateTimeFormatter

Java日期时间处理
本文深入探讨Java中日期时间处理的三种方法:使用DateFormat、SimpleDateFormat和DateTimeFormatter进行日期格式化和解析,展示不同格式和区域设置下的日期时间显示。

Java知识点–DataFormat,SimpleDateFormat和DateTimeFormatter

这个知识点没什么难懂的地方,就不一一赘述了。

import java.text.DateFormat;
import java.util.Date;
import java.util.Locale;

public class test01 {
	public static void main(String[] args) throws Exception{
		Date date = new Date();
		Locale[] locales= {Locale.CHINA,Locale.US};
		DateFormat[] df=new DateFormat[16];
		for(int i=0;i<locales.length;i++) {
			df[i*8]=DateFormat.getDateInstance(DateFormat.SHORT,locales[i]);
			df[i*8+1]=DateFormat.getDateInstance(DateFormat.MEDIUM, locales[i]);
			df[i*8+2]=DateFormat.getDateInstance(DateFormat.LONG, locales[i]);
			df[i*8+3]=DateFormat.getDateInstance(DateFormat.FULL, locales[i]);
			df[i*8+4]=DateFormat.getTimeInstance(DateFormat.SHORT, locales[i]);
			df[i*8+5]=DateFormat.getTimeInstance(DateFormat.MEDIUM, locales[i]);
			df[i*8+6]=DateFormat.getTimeInstance(DateFormat.LONG, locales[i]);
			df[i*8+7]=DateFormat.getTimeInstance(DateFormat.FULL, locales[i]);
		}
		for(int i=0;i<locales.length;i++) {
			var tip=i==0?"---中国日期格式---":"---美国日期格式---";
			System.out.println(tip);
			System.out.println("SHORT格式的日期格式:"+df[i*8].format(date));
			System.out.println("MEDIUM格式的日期格式:"+df[i*8+1].format(date));
			System.out.println("LONG格式的日期格式:"+df[i*8+2].format(date));
			System.out.println("FULL格式的日期格式:"+df[i*8+3].format(date));
			System.out.println("SHORT格式的时间格式:"+df[i*8+4].format(date));
			System.out.println("MEDIUM格式的时间格式:"+df[i*8+5].format(date));
			System.out.println("LONG格式的时间格式:"+df[i*8+6].format(date));
			System.out.println("FULL格式的时间格式:"+df[i*8+7].format(date));
		}
	}
}
import java.text.DateFormat;

public class test02 {
	public static void main(String[] args) throws Exception {
		var str1="2020/5/25";
		var str2="2020年5月25日";
		System.out.println(DateFormat.getDateInstance().parse(str2));
		System.out.println(DateFormat.getDateInstance(DateFormat.SHORT).parse(str1));
		//异常
		System.out.println(DateFormat.getDateInstance().parse(str1));
	}
}

比起DateFormat,SimpleDateFormat不拘于格式,只要你个格式化字符串足够准确,就会得到你想要的结果
控制符

import java.text.SimpleDateFormat;
import java.util.Date;

public class test03 {
	public static void main(String[] args) throws Exception{
		Date date = new Date();
		SimpleDateFormat format = new SimpleDateFormat("Gyyyy年的第D天");
		String string = format.format(date);
		System.out.println(string);
		String str="14###3月##21";
		SimpleDateFormat format2 = new SimpleDateFormat("y###MMM##d");
		System.out.println(format2.parse(str));
	}
}

  • DateTimeFormatter
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.time.format.FormatStyle;

public class test04 {
	public static void main(String[] args) {
		DateTimeFormatter[] formatter=new DateTimeFormatter[] {
				DateTimeFormatter.ISO_LOCAL_DATE,
				DateTimeFormatter.ISO_LOCAL_TIME,
				DateTimeFormatter.ISO_LOCAL_DATE_TIME,
				DateTimeFormatter.ofLocalizedDateTime(FormatStyle.FULL,FormatStyle.MEDIUM),
				DateTimeFormatter.ofLocalizedDate(FormatStyle.LONG),
				DateTimeFormatter.ofPattern("Gyyyy%%MMM%%dd HH:mm:ss")
		};
		LocalDateTime now = LocalDateTime.now();
		for(int i=0;i<formatter.length;i++) {
			System.out.println(now.format(formatter[i]));
			System.out.println(formatter[i].format(now));
		}
	}
}
  • 解析字符串
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;

public class test05 {
	public static void main(String[] args) {
		String str1="2020==05==25 10时01分01秒";
		DateTimeFormatter pattern = DateTimeFormatter.ofPattern("yyyy==MM==dd HH时mm分ss秒");
		LocalDateTime parse = LocalDateTime.parse(str1,pattern);
		System.out.println(parse);
		String str2="2020$$$5月$$$13 20小时";
		DateTimeFormatter pattern2 = DateTimeFormatter.ofPattern("yyy$$$MMM$$$dd HH小时");
		LocalDateTime parse2 = LocalDateTime.parse(str2,pattern2);
		System.out.println(parse2);
	}
}

Java 中使用 `SimpleDateFormat` 来处理日期字符串的解析格式化操作时,需特别注意日期格式的大小写含义以及特殊字符的转义问题。以下是针对 `yyyy-MM-dd` 格式的详细说明。 ### 日期格式中 `yyyy-MM-dd` 的含义 - `yyyy`:表示四位数的年份,例如 2023。 - `MM`:表示两位数的月份,范围是 01 到 12。 - `dd`:表示两位数的日期,范围是 01 到 31。 需要注意的是,大写的 `Y`(`YYYY`)代表的是基于周的年份(week-based year),这与 ISO-8601 标准相关,可能会导致某些跨年的日期被错误地归入下一年[^3]。 ### 使用 `SimpleDateFormat` 解析格式化日期 以下是一个示例代码片段,展示了如何使用 `SimpleDateFormat` 将字符串解析为 `Date` 对象,并将其重新格式化为指定格式: ```java import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.Date; public class DateFormatExample { public static void main(String[] args) { String inputDate = "2023-10-05"; SimpleDateFormat sdfInput = new SimpleDateFormat("yyyy-MM-dd"); try { Date parsedDate = sdfInput.parse(inputDate); System.out.println("Parsed Date: " + parsedDate); // 重新格式化日期 SimpleDateFormat sdfOutput = new SimpleDateFormat("yyyy/MM/dd"); String formattedDate = sdfOutput.format(parsedDate); System.out.println("Formatted Date: " + formattedDate); } catch (ParseException e) { e.printStackTrace(); } } } ``` ### 处理带特殊字符的时间格式(如 `T`) 如果输入的日期字符串包含特殊字符(如 `T` 或 `+`),需要确保这些字符在格式字符串中正确转义或匹配。例如,对于 `yyyy-MM-dd'T'HH:mm:ss` 格式,应使用如下方式: ```java SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss"); String inputDateTime = "2023-10-05T14:30:00"; try { Date date = sdf.parse(inputDateTime); System.out.println("Parsed DateTime: " + date); } catch (ParseException e) { e.printStackTrace(); } ``` ### 常见误区与注意事项 1. **避免直接替换字符串中的字符**:如用户提供的错误示例中,通过 `replaceAll("T", " ")` 修改原始字符串会导致后续解析出错。正确的做法是直接使用格式字符串来匹配输入内容[^1]。 2. **格式化输出时注意大小写**:如前所述,`YYYY` 可能导致跨年日期被错误地归入下一年,因此建议始终使用 `yyyy` 表示年份[^3]。 3. **线程安全性问题**:`SimpleDateFormat` 不是线程安全的类,多线程环境下使用时需谨慎,可以通过每次创建新实例或使用 `ThreadLocal` 来解决此问题。 ---
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值