`
jjhpeopl
  • 浏览: 108702 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

SimpleDateFormat、FastDateFormat和Joda-Time的介绍

 
阅读更多

众所周知,SimpleDateFormat是线程不安全的,不能多个线程公用。而FastDateFormat和Joda-Time都是线程安全的,可以放心使用。

 

SimpleDateFormat是JDK提供的,不需要依赖第三方jar包,而其他两种都得依赖第三方jar包。

FastDateFormat是apache的commons-lang3包提供的

Joda-Time需要依赖以下maven的配置(现在最新版本就是2.9.4)

<!--?xml version="1.0" encoding="UTF-8" standalone="no"?--> <dependency>
  <groupId>joda-time</groupId>
  <artifactId>joda-time</artifactId>
  <version>2.9.4</version>
</dependency>

 

SimpleDateFormat和FastDateFormat主要都是对时间的格式化

SimpleDateFormat在对时间进行格式化的方法format中,会先对calendar对象进行setTime的赋值,若是有多个线程同时操作一个SimpleDateFormat实例的话,就会对calendar的赋值进行覆盖,进而产生问题。

有三种方法可以解决这个问题:

1、在每次需要使用的时候,进行SimpleDateFormat实例的创建,这种方式会导致创建一些对象实例,占用一些内存,不建议这样使用。

2、使用同步的方式,在调用方法的时候加上synchronized,这样可以让线程调用方法时,进行加锁,也就是会造成线程间的互斥,对性能影响比较大。

3、使用ThreadLocal进行保存,相当于一个线程只会有一个实例,进而减少了实例数量,也防止了线程间的互斥,推荐使用这种方式。

 

FastDateFormat是线程安全的,可以直接使用,不必考虑多线程的情况

 

FastDateFormat format = FastDateFormat.getInstance("yyyy-MM-dd HH:mm:ss");
System.out.println(format.format(new Date()));

// 可以使用DateFormatUtils类来操作,方法里面也是使用的FastDateFormat类来做的
System.out.println(DateFormatUtils.format(new Date(), "yyyy-MM-dd HH:mm:ss"));

 

Joda-Time与以上两种有所区别,不仅仅可以对时间进行格式化输出,而且可以生成瞬时时间值,并与Calendar、Date等对象相互转化,极大的方便了程序的兼容性。

Joda-Time的类具有不可变性,因此他们的实例是无法修改的,就跟String的对象一样。

这种不可变性提现在所有API方法中,这些方法返回的都是新的类实例,与原来实例不同。

 

 以下是Joda-Time的一些使用方法

        // 得到当前时间
        Date currentDate = new Date();
        DateTime dateTime = new DateTime();  // DateTime.now()

        System.out.println(currentDate.getTime());
        System.out.println(dateTime.getMillis());

        // 指定某一个时间,如2016-08-29 15:57:02
        Date oneDate = new Date(1472457422728L);
        DateTime oneDateTime = new DateTime(1472457422728L);
        DateTime oneDateTime1 = new DateTime(2016, 8, 29, 15, 57, 2, 728);

        System.out.println(oneDate.toString());
        System.out.println(oneDateTime.toString());  // datetime默认的输出格式为yyyy-MM-ddTHH:mm:ss.SSS
        System.out.println(oneDateTime1.toString("MM/dd/yyyy hh:mm:ss.SSSa"));  // 直接就可以输出规定的格式

        // DateTime和Date之间的转换
        Date convertDate = new Date();
        DateTime dt1 = new DateTime(convertDate);
        System.out.println(dt1.toString());

        Date d1 = dt1.toDate();
        System.out.println(d1.toString());

        // DateTime和Calendar之间的转换
        Calendar c1 = Calendar.getInstance();
        DateTime dt2 = new DateTime(c1);
        System.out.println(dt2.toString());

        Calendar c2 = dt2.toCalendar(null);  // 默认时区Asia/Shanghai
        System.out.println(c2.getTimeZone());

        // 时间格式化
        DateTimeFormatter formatter = DateTimeFormat.forPattern("yyyy-MM-dd HH:mm:ss");
        DateTime dt3 = DateTime.parse("2016-08-29 13:32:33", formatter);
        System.out.println(dt3.toString());
        // 若是不指定格式,会采用默认的格式,yyyy-MM-ddTHH:mm:ss.SSS,若被解析字符串只到年月日,后面的时分秒会全部默认为0
        DateTime dt4 = DateTime.parse("2016-08-29T");
        System.out.println(dt4.toString());
        // 输出locale 输出2016年08月29日 16:43:14 星期一
        System.out.println(new DateTime().toString("yyyy年MM月dd日 HH:mm:ss EE", Locale.CHINESE));

        // 计算两个日期间隔的天数
        LocalDate start = new DateTime().toLocalDate();
        LocalDate end = new LocalDate(2016, 8, 25);
        System.out.println(Days.daysBetween(start ,end).getDays()); // 这里要求start必须早于end,否则计算出来的是个负数
        // 相同的还有间隔年数、月数、小时数、分钟数、秒数等计算
        // 类如Years、Hours等

        // 对日期的加减操作
        DateTime dt5 = new DateTime();
        dt5 = dt5.plusYears(1)          // 增加年
                .plusMonths(1)          // 增加月
                .plusDays(1)            // 增加日
                .minusHours(1)          // 减小时
                .minusMinutes(1)        // 减分钟
                .minusSeconds(1);       // 减秒数
        System.out.println(dt5.toString());

        // 判断是否闰月
        DateTime dt6 = new DateTime();
        DateTime.Property month = dt6.monthOfYear();
        System.out.println(month.isLeap());

 

 在例子中,有些方法没有写出来,有兴趣的同学可以自己试一试。

 

分享到:
评论
1 楼 qianban0201 2016-08-30  
这是我截止到目前为止看到的最详细的一片关于SimpleDateFormat、FastDateFormat和Joda-Time的介绍,楼主超赞  

相关推荐

    Java 实例 - 格式化时间SimpleDateFormat使用源代码-详细教程.zip

    Java 实例 - 格式化时间SimpleDateFormat使用源代码-详细教程.zip

    java SimpleDateFormat 显示于系统时间不符

    SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); date.setTime(time); System.out.println(sdf.format(date)); 发现时间于想要的时间不符,请运行Time.reg文件

    java DATE与时间戳互化

    数字时间戳服务(DTS:digital time stamp service)是网上电子商务安全服务项目之一,能提供电子文件的日期和时间信息的安全保护。 编辑本段组成部分  时间戳(time-stamp)是一个经加密后形成的凭证文档,它...

    有了这个,时间转换从此没问题

    SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); String dateString = formatter.format(currentTime); ParsePosition pos = new ParsePosition(8); Date currentTime_2 = ...

    DateUtil.java

    private final static SimpleDateFormat sdfYear = new SimpleDateFormat("yyyy"); private final static SimpleDateFormat sdfDay = new SimpleDateFormat("yyyy-MM-dd"); private final static SimpleDateFormat...

    java时间处理工具类--CalendarUtil(java源码)

    import java.text.SimpleDateFormat; import java.util.*; public class CalendarUtil { public static void main(String args[]) { System.out.println("First day of week is : " + new ...

    jackson-all 日期处理

    mapper.getSerializationConfig().setDateFormat(new java.text.SimpleDateFormat("yyyy-MM-dd HH:mm:ss")); mapper.getDeserializationConfig().setDateFormat(new java.text.SimpleDateFormat("yyyy-MM-dd HH:mm...

    Java超市会员管理系统(时间类)

    import java.text.SimpleDateFormat; import java.util.Date; public class DateDemo { public static void main(String[] args) { //当前日期和时间 Date date=new Date(); System.out.println(date); //将...

    struts的input标签支持日期格式化输出

    &lt;html:text property="runningStartDate" simpleDateFormat="yyyy-MM-dd HH:mm:ss"/&gt; 如何使用: 1.替换附件中的 struts-html.tld 2.替换附件中的struts.jar 3.页面中遇到Timestamp或Date类型的,自动转换成"yyyy-...

    java获取年月日,加减运算

    SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd"); Date parse = simpleDateFormat.parse("2019-09-08"); //字符串转日期 String format = simpleDateFormat.format(parse); //日期转...

    Java 工作日计算

    SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd"); WorkdayUtils workdayUtils = new WorkdayUtils(); workdayUtils.setLegalWorkdayList(legalWorkdayList); workdayUtils.setLegalHolidayList...

    java时间格式大全(算法源码)

    SimpleDateFormat formatter = new SimpleDateFormat("HH:mm:ss"); Date currentTime = new Date(); String dateString = formatter.format(currentTime); return dateString; } /** * 将长时间格式字符串转换...

    高并发之-SimpleDateFormat类的线程安全问题和解决方案.docx

    高并发之-SimpleDateFormat类的线程安全问题和解决方案.docx

    用JAVA实现时间比较

    SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); int date = 0; try { Date d1 = sdf.parse(date1); Date d2 = sdf.parse(date2); date = d1.compareTo(d2); } catch (ParseException...

    汉王打卡机sdk

    String Command = "GetRecord(start_time='2018-05-15 12:36:36' end_time=\"" + new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date()) + "\")"; FaceId_ErrorCode execute = faceId.Execute(Command,...

    Android_0618_Note

    一款手机便宜签,实现存储文本和图片。 String title = title_edt.getText().toString(); String content = content_edt.getText().toString(); ContentValues values = new ContentValues(); if (img_iv....

    JAVA日期字符串与日期互相转换(非常实用)

    JAVA:日期字符串与日期互相转换 (日期类型转字符串,字符串转日期格式) SimpleDateFormat formatter= new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");

    前端页面格式化时间、时间字符串解析

    时间格式化 使用举例: var fmt = SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); var aTime = fmt.parse("2020-12-31 23:59:59");//Date 类型 var strTime = fmt.format(aTime);//String 类型

    java时间格式转换

    java时间格式转换:自动添加年月日(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss E"))后加一个大写E就可以了

    JavaScript实现的SimpleDateFormat

    JavaScript实现的java.text.SimpleDateFormat。希望多多交流。

Global site tag (gtag.js) - Google Analytics