在我们的业务代码中很多地方会用到SimpleDateFormat,把long型的时间转换成string类型,这里就会用到SimpleDateFormat,而这个类不是线程安全的,所以业务代码中往往如下的方式使用:
07 |
public static String milliSecondToString(long millisecond) {
|
08 |
SimpleDateFormat sd = new SimpleDateFormat( "yyyyMMddHHmmss" );
|
09 |
return sd.format( new Date (millisecond));
|
在以前优化hive的udf的时候就发现过这样子使用SimpleDateFormat会很耗时,稍微看下SimpleDateFormat的构造函数就会知道它的构造函数会调用正则,所以应该尽量少new SimpleDateFormat。
我们来做下测试:
01 |
import java.text.SimpleDateFormat;
|
02 |
import java.util. Date ;
|
04 |
import org.apache.commons.lang.time.FastDateFormat;
|
06 |
public class PerfDateFormat {
|
14 |
public static String milliSecondToString(long millisecond) {
|
15 |
SimpleDateFormat sd = new SimpleDateFormat( "yyyyMMddHHmmss" );
|
16 |
return sd.format( new Date (millisecond));
|
19 |
static ThreadLocal<SimpleDateFormat> yyyyMMddHHmmss = new ThreadLocal<SimpleDateFormat>() {
|
21 |
protected SimpleDateFormat initialValue()
|
23 |
return new SimpleDateFormat( "yyyyMMddHHmmss" );
|
26 |
public static String milliSecondToStringOpt(long millisecond) {
|
27 |
return yyyyMMddHHmmss. get ().format( new Date (millisecond));
|
30 |
static FastDateFormat yyyyMMddHHmmssF = FastDateFormat
|
31 |
.getInstance( "yyyyMMddHHmmss" );
|
33 |
public static String milliSecondToStringUseFastDateFormat(long millisecond) {
|
34 |
return yyyyMMddHHmmssF.format( new Date (millisecond));
|
37 |
public static void perf( int count) {
|
38 |
System.out.println( "Time " + milliSecondToString( new Date ().getTime()));
|
39 |
long start = System.currentTimeMillis();
|
40 |
for ( int i = 0 ; i < count; i++) {
|
41 |
long seconds = new Date ().getTime();
|
42 |
milliSecondToString(seconds);
|
44 |
long end = System.currentTimeMillis();
|
45 |
long cost1 = (end - start);
|
46 |
System.out.println( "c1 " + cost1);
|
47 |
System.out.println( "Time " + milliSecondToString( new Date ().getTime()));
|
48 |
start = System.currentTimeMillis();
|
50 |
for ( int i = 0 ; i < count; i++) {
|
51 |
long seconds = new Date ().getTime();
|
52 |
milliSecondToStringOpt(seconds);
|
54 |
end = System.currentTimeMillis();
|
55 |
long cost2 = (end - start);
|
56 |
System.out.println( "c2 " + cost2);
|
57 |
System.out.println(cost1 - cost2);
|
58 |
System.out.println(cost1 / cost2);
|
59 |
System.out.println((double) cost1 / count);
|
60 |
start = System.currentTimeMillis();
|
61 |
for ( int i = 0 ; i < count; i++) {
|
62 |
long seconds = new Date ().getTime();
|
63 |
milliSecondToStringUseFastDateFormat(seconds);
|
65 |
end = System.currentTimeMillis();
|
66 |
long cost3 = (end - start);
|
67 |
System.out.println( "c3 " + cost3);
|
70 |
public static void main( String [] args) {
|
milliSecondToString、milliSecondToStringOpt、milliSecondToStringUseFastDateFormat这三个方法都是完成相同的功能,循环调用这个方法1千万次,测试结果如下:
Time 20140305103942
c1 51743
Time 20140305104033
c2 5015
46728
10
0.0051743
c3 11034
这个测试结果是在我自己的笔记本上面做的,我们发现采用ThreadLocal的milliSecondToStringOpt是最快的,其次是milliSecondToStringUseFastDateFormat采用了apache的FastDateFormat,最后面是milliSecondToString。而milliSecondToStringOpt是milliSecondToString的十倍,调用一千万次,milliSecondToString可以节省46s左右,像线上有几十亿条记录,假设每条记录调用milliSecondToString一次(实际情况是每次会调用多次),以10亿来算,那么就会节省1.277个小时。
分享到:
相关推荐
SimpleDateFormat 详解 SimpleDateFormat 是 Java 语言中的一种日期和时间格式化类,用于将日期和时间格式...通过合理地使用 SimpleDateFormat,我们可以实现日期和时间的高效格式化和解析,提高程序的性能和可读性。
在性能要求较高的场景下,可以考虑使用`java.time`包中的`DateTimeFormatter`类,它是Java 8及更高版本引入的,提供了更高效且更易用的日期时间格式化功能。 总结来说,`SimpleDateFormat`是Java中处理日期和时间...
本文将详细介绍`SimpleDateFormat`类的基本用法及应用场景,并通过具体的示例代码帮助读者更好地理解和掌握其使用技巧。 #### 二、`SimpleDateFormat`概述 `SimpleDateFormat`是Java中的一个用于日期格式化与解析的...
- 实现逻辑:使用`SimpleDateFormat`以`"yyyy-MM-dd HH:mm:ss"`的格式获取当前日期和时间,然后解析该字符串为`Date`对象。 - 示例代码: ```java public static Date getNowDate() { Date currentTime = new ...
在并发情况下,可以使用同步块或者静态工厂方法来创建新的`SimpleDateFormat`实例,确保在每次需要格式化或解析日期时都创建新的对象。 ```java public class SafeDateFormat { private static final ThreadLocal...
总结一下,通过使用SimpleDateFormat类,我们可以灵活地在Date和String之间进行转换,而Date类提供的getTime()和构造函数则使得Date与long之间的转换变得简单直接。在实际开发过程中,根据不同的需求选择合适的转换...
为了将日期转换为特定格式的字符串,或者将字符串转换为日期,我们可以使用`SimpleDateFormat`类。例如,要将当前时间格式化为`yyyy-MM-dd HH:mm:ss`格式,可以这样做: ```java SimpleDateFormat formatter = new ...
在实际开发中,如果你不想每次都创建新的`SimpleDateFormat`实例,可以考虑使用`ThreadLocal<SimpleDateFormat>`来存储线程局部的`SimpleDateFormat`,避免多线程环境下的同步问题。 总结起来,`java.text....
为了获取当前月份的第一天,我们可以创建一个`Calendar`实例并将其日期字段设置为一个月的第一天,然后使用`SimpleDateFormat`将其转换为字符串格式。具体步骤如下: 1. 创建`Calendar`实例。 2. 使用`set`方法将`...
SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); String beginDateStr = simpleDateFormat.format(beginDate); System.out.println("开始时间:" + beginDateStr); ...
通过上述介绍,我们可以了解到在Java中如何使用 `java.util.Date` 和 `java.text.SimpleDateFormat` 来处理日期和时间数据。这两个类在实际开发中非常实用,尤其当需要对日期时间进行格式化或解析时。理解和掌握这些...
### JAVA中获得本地系统时间的方法 在Java编程中,获取本地系统的当前时间是常见的...- 使用`SimpleDateFormat`则更适合需要将日期时间以固定格式输出的场景。 在实际开发过程中,可以根据具体需求选择合适的方法。
可以使用`SimpleDateFormat`的`parse`方法将符合指定格式的字符串转换为日期对象。 ```java public static Date strToDateLong(String strDate) { SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd...
标题和描述中提到的知识点非常丰富,包括Spring IOC框架、Hibernate框架、多线程编程以及JavaScript编程等。...这些是Java开发人员在日常开发中经常使用到的技术点,了解和掌握它们对于进行高效、安全的编程至关重要。
2. **SimpleDateFormat类**:`SimpleDateFormat`是`DateFormat`的子类,它可以使用与用户相关的日期/时间格式来格式化和解析日期。构造函数接受一个模式字符串作为参数,这个模式字符串定义了日期和时间的格式。例如...
本文将详细介绍如何在Java中实现日期与时间的比较,包括使用`SimpleDateFormat`、`Date`、`Calendar`等类进行时间格式化和比较的方法,并通过示例代码展示具体实现过程。 #### 二、使用`SimpleDateFormat`和`Date`...
- 当需要将字符串转换为日期对象时,可以使用`SimpleDateFormat.parse()`方法。 - 示例: ```java SimpleDateFormat sdf = new SimpleDateFormat("dd/MM/yyyy"); Date date = sdf.parse("25/04/2003"); // 将...
根据提供的文件信息,本文将详细解析Java中与时间处理相关的几个关键知识点,这些知识点主要集中在如何获取当前时间、格式化日期、以及...在实际开发中,合理运用这些方法能够帮助我们更加高效地处理与时间相关的逻辑。
值得注意的是,Android 8.0(API级别26)及更高版本中,建议使用`android.app.AlarmManager.RTC_WAKEUP`或`android.app.JobScheduler`等更高效的方式来调度周期性任务,而不是使用`Handler`或`Timer`,以减少对电池...
文件中的代码示例使用了 `SimpleDateFormat` 来格式化和解析日期。例如: ```java SimpleDateFormat myFormatter = new SimpleDateFormat("yyyy-MM-dd"); ``` 这行代码创建了一个 `SimpleDateFormat` 对象,指定了...