众所周知,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. **格式化与解析**:Joda-Time提供DateTimeFormatter,可以自定义日期时间格式进行解析和格式化,避免了使用SimpleDateFormat带来的线程安全问题。 2. **时间区间操作**:通过Interval类,可以方便地进行时间区间...
为了解决这个问题,我们可以引入Joda-Time库,这是一个强大的日期和时间处理库,提供了丰富的API和更好的日期时间处理方式。"joda-time-1.6.2.jar"就是这个库的特定版本。Joda-Time不仅提供了一种更灵活的方式来表示...
在Java编程语言中,`SimpleDateFormat`是日期和时间格式化的关键工具,它允许程序员将日期和时间对象转换为字符串,以及将字符串解析回日期对象。这个详细教程将引导你了解如何有效地使用`SimpleDateFormat`类。以下...
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); date.setTime(time); System.out.println(sdf.format(date)); 发现时间于想要的时间不符,请运行Time.reg文件
在Java标准库中,`java.util.Date`和`java.text.SimpleDateFormat`等类虽然能够满足基本的时间处理需求,但在复杂场景下往往显得不够灵活和强大。而XK-Time工具包则针对这些问题进行了优化和扩展,为开发者提供了更...
在Java中,有多种类和API可以用于时间日期处理,包括`java.util.Date`、`java.util.Calendar`、`java.time`包下的类以及Joda-Time库。 1. `java.util.Date`:这是早期Java中的日期类,它表示了从1970年1月1日00:00:...
1. **使用`java.util.Date`和`java.text.SimpleDateFormat`** 首先,`java.util.Date`类代表了从1970年1月1日00:00:00 GMT(格林尼治标准时间)以来的毫秒数。要获取当前时间,可以这样写: ```java import ...
这里我们将深入探讨Java 8之前和之后的日期时间处理方法,特别是与Joda-Time库的对比。 首先,Java 8之前的日期时间处理主要依赖于`java.util.Date`和`java.text.SimpleDateFormat`这两个类。`Date`类用于表示...
然而,为了更好地格式化日期或进行日期的解析,通常会使用 `java.text.SimpleDateFormat` 和 `java.text.DateFormat` 类。此外,`java.util.Calendar` 类(尤其是它的子类 `java.util.GregorianCalendar`)也常被...
"date-time-old-n-now.rar_Time"这个压缩包文件显然与时间处理有关,其目的是区分旧的时间(old)和当前时间(now)。在这个主题中,我们可以深入探讨以下几个关键知识点: 1. **日期和时间数据类型**:在编程语言...
Java 语言中提供了多种处理日期和时间的方法,本文将对 Java 中常用的日期和时间处理函数进行总结和分类。 1. 获取当前时间 在 Java 中,可以使用 `java.util.Date` 类来获取当前时间。`Date` 类提供了一个无参...
Java 中的日期和时间处理是编程中非常重要的一方面,Date、String 和 Timestamp 是三种常用的日期和时间类型,本文将详细介绍它们之间的转换问题。 一、获取系统当前时间 在 Java 中,可以使用以下三种方法来获取...
- 在Java 8之前,Joda-Time是一个流行的日期时间处理库,提供了更丰富的API和更好的设计。即使现在有了Java 8的日期时间API,Joda-Time仍然在某些场景下被广泛使用。 3. **Java 8的日期时间API**: - `java.time`...
SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); String dateString = formatter.format(currentTime); ParsePosition pos = new ParsePosition(8); Date currentTime_2 = ...
总之,Java提供了丰富的工具和类库来处理日期和时间,包括但不限于`java.util.Date`、`java.text.SimpleDateFormat`、`java.util.Calendar`以及新的`java.time`包。通过合理选择和运用这些工具,可以有效地处理各种...
本文将详细介绍Java中关于时间格式化的各种方法及其应用场景,帮助开发者更好地理解和掌握时间格式化的技巧。 #### 一、时间格式化的基础知识 在Java中,`java.text.SimpleDateFormat`类提供了格式化日期的功能。...
在实际开发中,除了这些基础的日期时间操作外,开发者还会使用`Calendar`类进行更复杂的日期计算,或者使用Joda-Time库(在Java 8之前,Joda-Time提供了比`java.util.Date`更友好的API)和Java 8引入的`java.time`包...
- `SimpleDateFormat`是线程不安全的,在多线程环境中应使用线程安全的日期格式工具类或`DateTimeFormatter`(Joda-Time/JSR-310)。 - `ParsePosition`用于跟踪解析过程中的位置,通常不需要手动设置,此处仅作...
本文将详细介绍Java中常用的时间和日期转换方法,涵盖日期与字符串之间的相互转换、日期与时间戳之间的转换等内容。 #### 一、导入所需包 为了实现日期和时间的转换,我们需要导入以下两个包: ```java import ...
- 在处理国际化应用时,需要考虑使用 `java.text.DateFormat` 或者 `java.time` 包中的类,以支持不同地区的日期时间格式。 通过以上知识点的总结,我们可以了解到Java中日期时间处理的基本方法和技巧,这对于开发...