在java中格式化时间和日期或者把字符串转换成日期和时间都可以用DateFormat,simpleDateFormat类,而且在JAVA8中还添加了DateTimeFormat格式化日期和时间,使这些转换越来越简单。
使用DateFormat格式化时间或者日期
1.时间或者日格式成字符串用format()
DateFormat是一个抽象类,提供了这几种方法来获取DateFormat对象:
DateFormat.getDateInstance():返回一个日期格式器,它格式化后的字符串只有日期,没有时间,可以传入多个参数。
DateFormat.getTimeInstance():返回一个时问格式器,它格式化后的字符串只有时间,没有日期。
DateFormat.getDateTimeInstance():返回一个日期、时问格式器,它格式化后的字符串既有日期,也有时间。
上面3个方法可以指定日期,时间样式、它们是DateFormat的4个静态常量:FULL,LONG,MEDIUM,SHORT,通过4个样式参数可以控制生成的格式化字符串。如:
public class test {
public static void main (String arg[]){
Date date=new Date();
Locale[] locales={Locale.CANADA,Locale.US};
DateFormat[] das=new DateFormat[10];
for(int i=0;i<locales.length;i++)
{
//四种样式
das[i*5]=DateFormat.getDateInstance(DateFormat.SHORT,locales[i]);
das[i*5+1]=DateFormat.getDateInstance(DateFormat.MEDIUM,locales[i]);
das[i*5+2]=DateFormat.getDateInstance(DateFormat.LONG,locales[i]);
das[i*5+3]=DateFormat.getDateInstance(DateFormat.FULL,locales[i]);
das[i*5+4]=DateFormat.getDateInstance();
}
for(int i=0;i<locales.length;i++)
{
String tip=i==0?"------中国日期格式":"美国日期格式";
System.out.println(tip);
System.out.println("SHORT:"+das[i*5].format(date));
System.out.println("MEDIUM:"+das[i*5+1].format(date));
System.out.println("LONG:"+das[i*5+2].format(date));
System.out.println("FULL:"+das[i*5+3].format(date));
System.out.println("没有指定:"+das[i*5+4].format(date));
}
}
}
结果是:
这个例子创建的是日期的格式,分别指定了locale和日期输出的样式,创建DateFormat对象没有给它参数时,会用默认的。
2.字符串转换成日期或者时间
DateFormat的parse()方法可以把一个字符串解析成Date对象,但它要求被解析的字符串必须符合日期期字符串的要求,否则可能抛出
ParseException异常
public class test {
public static void main (String arg[]){
String str1="2019-3-3";
String str2="2019年3月3日";
try {
System.out.println(DateFormat.getDateInstance().parse(str1));
}catch (ParseException ex)
{
//如果这个会抛出错误,从而执行这行
System.out.println("str1::"+ex.getMessage());
}
try {
System.out.println(DateFormat.getDateInstance().parse(str2));
}catch (ParseException ex)
{ //如果这个会抛出错误,从而执行这行
System.out.println("str2::"+ex.getMessage());
}
}
}
结果:
由于第2个格式不对,所以抛出错误。
使用SimpleDateFormat格式化时间或者日期
前面介绍的DateFormat的parse()方法可以把字符串解析成Date寸象,但实际DateFormat的parse()方法不够灵活—它要求被解析的字符串必须满足特定的格式!为了更好地格式化日期、解析日期字符串,Java提供了SimpIeDateFormat类。SimpIeDateFormat是DateFormat的子类,正如它的名字所暗示的,它是“简单”的日期格式器,但是SimpIeDateFormat比DateFormat更简单,功能强大。
SimpleDateFormat函数语法:
G 年代标志符
y 年
M 月
d 日
h 时 在上午或下午 (1~12)
H 时 在一天中 (0~23)
m 分
s 秒
S 毫秒
E 星期
D 一年中的第几天
F 一月中第几个星期几
w 一年中第几个星期
W 一月中第几个星期
a 上午 / 下午 标记符
k 时 在一天中 (1~24)
K 时 在上午或下午 (0~11)
z 时区
创建SimpleDateFormat对象需要传入一个pattern字符串,这个pattern不是正则表达式,而是一个日期模板字符串。
public class test {
public static void main (String arg[])throws ParseException{
Date d=new Date();
SimpleDateFormat simpleDateFormat=new SimpleDateFormat("Gyyyy年中第D天");
String dateStr=simpleDateFormat.format(d);
System.out.println("把时间格式成字符串:"+dateStr);
String str="14###三月##21";
SimpleDateFormat simpleDateFormat1=new SimpleDateFormat("y###MMM##d");
System.out.println("把字符串格式成时间:"+simpleDateFormat1.parse(str));
//字符串转换成Date
str="2019-03-23";
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
Date data=sdf.parse(str);
}
}
结果:
把时间格式成字符串:公元2019年中第62天
把字符串格式成时间:Fri Mar 21 00:00:00 CST 2014
Process finished with exit code 0
SimpleDateFormat可以自定义格式,更简单和方便。
使用DateTimeFormatter完成格式化
使用DateTimeFormatter将日期、时间( LocalDate. LocalDateTime, LocalTime等实例)格式化为字符串可通过如下两种方式。
调用DateTimeFormatter的format(TemporalAccessor temporal)方法执行格式化,其中LocalDate. LocalDateTime, LocalTime等类都是TemporalAccessor接口的实现类。
调用 LocalDate, LocalDateTime, LocalTime等日期、时间对象的format(DateTimeFormatter formatter)方法执行格式化。
1
public class test {
public static void main (String arg[])throws ParseException{
//创建5个DateTimeFormatter对象
DateTimeFormatter[] formatters=new DateTimeFormatter[]{
//使用常量创建对象
DateTimeFormatter.ISO_LOCAL_DATE,
DateTimeFormatter.ISO_LOCAL_TIME,
DateTimeFormatter.ISO_LOCAL_DATE_TIME,
//使用本地化风格创建
DateTimeFormatter.ofLocalizedDateTime(FormatStyle.LONG),
//自定义创建
DateTimeFormatter.ofPattern("Gyyyy%%MMM%%dd HH:mm:ss")
};
LocalDateTime dateTime=LocalDateTime.now();
for (int i=0;i<formatters.length;i++)
{
//这2行代码一样
System.out.println(dateTime.format(formatters[i]));
// System.out.println(formatters[i].format(dateTime));
}
}
}
结果:
2019-03-03
16:25:27.199
2019-03-03T16:25:27.199
2019年3月3日 下午04时25分27秒
公元2019%%三月%%03 16:25:27
Process finished with exit code 0
使用DateTimeFormatter解析字符串
为了使用LocaIDateTime、DateTimeFormatter将指定格式的字符串解析成日期、时间对象(LocalDate ,LocalTime等实例),可通过日期、I时间对象提供的parse(CharSequence text ,DateTimeFormatter formatter)方法进行解析。
public class test {
public static void main (String arg[])throws ParseException{
//定义一个任意格式的日期、l讨间字符串
String strl="2014-04-12 O1时06分09秒";
//根据需要解析的日期、时间字符串定义解析所用的格式器
DateTimeFormatter fomatterl=DateTimeFormatter.ofPattern("yyyy-MM-dd HH时mm分ss秒");
//执行解析
LocalDateTime dtl=LocalDateTime.parse(strl,fomatterl);
System.out.println(dtl);//输出2014一04一12T01:06:09
}
}
原创来源:滴一盘技术