Java中的日期、时间戳和字符串格式的日期等相互转换基本上使用简单数据格式类和数据类,或joda-time库。
日期和时间到字符串的转换格式
通过简单日期格式
如果日期和时间类型为java.util.Date,则执行以下操作:
创建具有指定字符串格式的java.text.SimpleDateFormat类。
调用java.text.SimpleDateFormat类的format方法,将指定的时间实例(java.util.Date类实例)传递给该方法。
示例:
导入Java.text.simple date format;
import java.util.Date;
公共类演示{
publicstaticvoidmain (字符串[ ] args ) {
simpledateformatsdf=newsimpledateformat (yyyy-mm-ddhh : mm : ss );
日期=new date (;
string datestr=SDF.format (数据;
system.out.println(datestr );
}
}
通过joda-time库
要使用第三方日期和时间库joda-time,请执行以下步骤:
joda-time将java.util.Date或java.util.Calendar对象转换为joda-time的org.joda.time.DateTime类对象。
调用org.joda.time.DateTime类的toString方法。 toString方法支持日期和时间格式转换(pattern )。
示例:
import org.joda.time.DateTime;
import java.util.Calendar;
import java.util.Date;
import java.util.Locale;
公共类演示{
publicstaticvoidmain (字符串[ ] args ) {
日期=new date (;
数据时间数据=新数据时间(date;
system.out.println (datetime.tostring (yyyy-mm-ddhh 3360 mm : ss ) );
system.out.println (datetime.tostring (yyyy年MM月dd日HH:mm:ss EE ',Locale.CHINESE ) );
calendar calendar=calendar.getinstance (;
日期日期1=新日期(日历);
system.out.println (datetime1. tostring (yyyy/mm/ddhh : mm : ss,SSS ' ) );
system.out.println (datetime1. tostring (yyyy-mm-ddhh : mm : ss aee ',Locale.US ) );
}
}
字符串的日期和时间类型
通过简单日期格式
步骤如下。
创建具有指定字符串格式的java.text.SimpleDateFormat类。
调用java.text.SimpleDateFormat类的parse方法。
示例:
导入Java.text.parse exception;
导入Java.text.simple date format;
import java.util.Date;
公共类演示{
publicstaticvoidmain (字符串[ ] args ) throws ParseException { )。
simpledateformatsdf=newsimpledateformat (yyyy-mm-ddhh : mm : ss );
datedate=SDF.parse (2019-07-2822336039336013 );
系统. out.println (date;
//转动时间戳
system.out.println (date.gettime );
}
}
通过joda-time库
joda-time库的日期和时间旋转
换都是围绕着 org.joda.time.DateTime 类,具体步骤如下:利用 joda-time 库的 DateTimeFormat 和 DateTimeFormatter 将日期时间字符串转换成 org.joda.time.DateTime 类对象。
然后可以选择性地可将 org.joda.time.DateTime 类对象转换为 java.util.Date 类对象或者 java.util.Calendar 类对象。
示例:
import org.joda.time.DateTime;
import org.joda.time.format.DateTimeFormat;
import org.joda.time.format.DateTimeFormatter;
import java.util.Calendar;
import java.util.Date;
import java.util.Locale;
public class Demo {
public static void main(String[] args) {
DateTimeFormatter format = DateTimeFormat.forPattern("yyyy-MM-dd HH:mm:ss");
DateTime dateTime = DateTime.parse("2017-08-12 04:05:00", format);
System.out.println(dateTime);
// 转换成 java.util.Date 类
Date date = dateTime.toDate();
System.out.println(date);
// 转换成 java.util.Calendar 类
Calendar calendar = dateTime.toCalendar(Locale.CHINA);
System.out.println(calendar);
}
}
线程安全形式
DateFormat 和 SimpleDateFormat 类都不是线程安全的,在多线程环境下调用 format() 和 parse() 方法应该使用同步代码来避免问题。
如下列出了 4 种解决方法。
需要时创建新实例
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
public class DateUtil {
public static String format(Date date) {
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
return sdf.format(date);
}
public static Date parse(String strDate) throws ParseException {
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
return sdf.parse(strDate);
}
}
使用同步方法
当线程较多时,当一个线程调用方法时,其他想要调用此方法的线程就会 block,多线程并发量大的时候会对性能有一定的影响。
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
public class DateUtil {
private static SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
public static String format(Date date) {
synchronized (sdf) {
return sdf.format(date);
}
}
public static Date parse(String strDate) throws ParseException {
synchronized (sdf) {
return sdf.parse(strDate);
}
}
}
利用 ThreadLocal
使用 ThreadLocal,也是将共享变量变为独享,线程独享肯定能比方法独享在并发环境中能减少不少创建对象的开销。如果对性能要求比较高的情况下,一般推荐使用这种方法。
import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
public class DateUtil {
private static ThreadLocal threadLocal = new ThreadLocal() {
@Override
protected DateFormat initialValue() {
return new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
}
};
public static Date parse(String dateStr) throws ParseException {
return threadLocal.get().parse(dateStr);
}
public static String format(Date date) {
return threadLocal.get().format(date);
}
}
另一种写法:
import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
public class DateUtil {
private static final String DATE_FORMAT = "yyyy-MM-dd HH:mm:ss";
private static ThreadLocal threadLocal = new ThreadLocal();
public static DateFormat getDateFormat() {
DateFormat df = threadLocal.get();
if (df == null) {
df = new SimpleDateFormat(DATE_FORMAT);
threadLocal.set(df);
}
return df;
}
public static String formatDate(Date date) {
return getDateFormat().format(date);
}
public static Date parse(String strDate) throws ParseException {
return getDateFormat().parse(strDate);
}
}
抛弃 JDK,使用第三方时间相关库
使用 Apache commons 里的 FastDateFormat,宣称是既快又线程安全的 SimpleDateFormat,可惜的是,它只能对日期进行 format,不能对日期串进行解析。
使用 Joda-Time 类库来处理时间相关问题。
总结
经过压力测试后,发现方法一最慢,方法三最快,但是就算是最慢的方法一性能也不差,一般系统方法一和方法二就可以满足,所以说在这个点上很难成为您系统的瓶颈所在。从简单的角度来说,建议使用方法一或者方法二,如果在必要的时候,追求那么一点性能提升的话,可以考虑用方法三,用 ThreadLocal 做缓存。
此外,Joda-Time 类库对时间处理方式也比较完美,建议使用。