`
bupt04406
  • 浏览: 347743 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

如何高效使用SimpleDateFormat

    博客分类:
  • java
 
阅读更多

在我们的业务代码中很多地方会用到SimpleDateFormat,把long型的时间转换成string类型,这里就会用到SimpleDateFormat,而这个类不是线程安全的,所以业务代码中往往如下的方式使用:

01 /**
02  * 将毫秒时间转换为 20120813154028 这种形式
03  *
04  * @param millisecond
05  * @return
06  */
07 public static String milliSecondToString(long millisecond) {
08   SimpleDateFormat sd = new SimpleDateFormat("yyyyMMddHHmmss");
09   return sd.format(new Date(millisecond));
10 }

在以前优化hive的udf的时候就发现过这样子使用SimpleDateFormat会很耗时,稍微看下SimpleDateFormat的构造函数就会知道它的构造函数会调用正则,所以应该尽量少new SimpleDateFormat。

​我们来做下测试:

01 import java.text.SimpleDateFormat;
02 import java.util.Date;
03  
04 import org.apache.commons.lang.time.FastDateFormat;
05  
06 public class PerfDateFormat {
07  
08   /**
09    * 将毫秒时间转换为 20120813154028 这种形式
10    *
11    * @param millisecond
12    * @return
13    */
14   public static String milliSecondToString(long millisecond) {
15     SimpleDateFormat sd = new SimpleDateFormat("yyyyMMddHHmmss");
16     return sd.format(new Date(millisecond));
17   }
18  
19   static ThreadLocal<SimpleDateFormat> yyyyMMddHHmmss = new ThreadLocal<SimpleDateFormat>() {
20     @Override
21     protected SimpleDateFormat initialValue()
22     {
23       return new SimpleDateFormat("yyyyMMddHHmmss");
24     }
25   };
26   public static String milliSecondToStringOpt(long millisecond) {
27     return yyyyMMddHHmmss.get().format(new Date(millisecond));
28   }
29  
30   static FastDateFormat yyyyMMddHHmmssF = FastDateFormat
31       .getInstance("yyyyMMddHHmmss");
32  
33   public static String milliSecondToStringUseFastDateFormat(long millisecond) {
34     return yyyyMMddHHmmssF.format(new Date(millisecond));
35   }
36  
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);
43     }
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();
49     // SimpleDateFormat sd = new SimpleDateFormat("yyyyMMddHHmmss");
50     for (int i = 0; i < count; i++) {
51       long seconds = new Date().getTime();
52       milliSecondToStringOpt(seconds);
53     }
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);
64     }
65     end = System.currentTimeMillis();
66     long cost3 = (end - start);
67     System.out.println("c3 " + cost3);
68   }
69  
70   public static void main(String[] args) {
71     perf(10000000);
72   }
73 }

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 详解 SimpleDateFormat 是 Java 语言中的一种日期和时间格式化类,用于将日期和时间格式...通过合理地使用 SimpleDateFormat,我们可以实现日期和时间的高效格式化和解析,提高程序的性能和可读性。

    Java中的SimpleDateFormat使用详解

    在性能要求较高的场景下,可以考虑使用`java.time`包中的`DateTimeFormatter`类,它是Java 8及更高版本引入的,提供了更高效且更易用的日期时间格式化功能。 总结来说,`SimpleDateFormat`是Java中处理日期和时间...

    Java日期格式化及其使用例子收集

    本文将详细介绍`SimpleDateFormat`类的基本用法及应用场景,并通过具体的示例代码帮助读者更好地理解和掌握其使用技巧。 #### 二、`SimpleDateFormat`概述 `SimpleDateFormat`是Java中的一个用于日期格式化与解析的...

    java 中的date的使用大全 感觉很有用啊

    - 实现逻辑:使用`SimpleDateFormat`以`"yyyy-MM-dd HH:mm:ss"`的格式获取当前日期和时间,然后解析该字符串为`Date`对象。 - 示例代码: ```java public static Date getNowDate() { Date currentTime = new ...

    Java DateFormat并发实现

    在并发情况下,可以使用同步块或者静态工厂方法来创建新的`SimpleDateFormat`实例,确保在每次需要格式化或解析日期时都创建新的对象。 ```java public class SafeDateFormat { private static final ThreadLocal...

    Java日期时间Date类型,long类型,String类型表现形式的转换.pdf

    总结一下,通过使用SimpleDateFormat类,我们可以灵活地在Date和String之间进行转换,而Date类提供的getTime()和构造函数则使得Date与long之间的转换变得简单直接。在实际开发过程中,根据不同的需求选择合适的转换...

    java时间转换大全.txt

    为了将日期转换为特定格式的字符串,或者将字符串转换为日期,我们可以使用`SimpleDateFormat`类。例如,要将当前时间格式化为`yyyy-MM-dd HH:mm:ss`格式,可以这样做: ```java SimpleDateFormat formatter = new ...

    java格式化日期类

    在实际开发中,如果你不想每次都创建新的`SimpleDateFormat`实例,可以考虑使用`ThreadLocal&lt;SimpleDateFormat&gt;`来存储线程局部的`SimpleDateFormat`,避免多线程环境下的同步问题。 总结起来,`java.text....

    获取当月的第一天和最后一天

    为了获取当前月份的第一天,我们可以创建一个`Calendar`实例并将其日期字段设置为一个月的第一天,然后使用`SimpleDateFormat`将其转换为字符串格式。具体步骤如下: 1. 创建`Calendar`实例。 2. 使用`set`方法将`...

    使用Java实现文件夹的遍历

    SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); String beginDateStr = simpleDateFormat.format(beginDate); System.out.println("开始时间:" + beginDateStr); ...

    Java中表示时间的类

    通过上述介绍,我们可以了解到在Java中如何使用 `java.util.Date` 和 `java.text.SimpleDateFormat` 来处理日期和时间数据。这两个类在实际开发中非常实用,尤其当需要对日期时间进行格式化或解析时。理解和掌握这些...

    JAVA中获得本地系统时间的方法

    ### JAVA中获得本地系统时间的方法 在Java编程中,获取本地系统的当前时间是常见的...- 使用`SimpleDateFormat`则更适合需要将日期时间以固定格式输出的场景。 在实际开发过程中,可以根据具体需求选择合适的方法。

    java时间转换大全

    可以使用`SimpleDateFormat`的`parse`方法将符合指定格式的字符串转换为日期对象。 ```java public static Date strToDateLong(String strDate) { SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd...

    ikm-java-material-005.pdf

    标题和描述中提到的知识点非常丰富,包括Spring IOC框架、Hibernate框架、多线程编程以及JavaScript编程等。...这些是Java开发人员在日常开发中经常使用到的技术点,了解和掌握它们对于进行高效、安全的编程至关重要。

    java获取系统时间.txt

    2. **SimpleDateFormat类**:`SimpleDateFormat`是`DateFormat`的子类,它可以使用与用户相关的日期/时间格式来格式化和解析日期。构造函数接受一个模式字符串作为参数,这个模式字符串定义了日期和时间的格式。例如...

    java判断时间大小

    本文将详细介绍如何在Java中实现日期与时间的比较,包括使用`SimpleDateFormat`、`Date`、`Calendar`等类进行时间格式化和比较的方法,并通过示例代码展示具体实现过程。 #### 二、使用`SimpleDateFormat`和`Date`...

    Date日期时间 各种转换

    - 当需要将字符串转换为日期对象时,可以使用`SimpleDateFormat.parse()`方法。 - 示例: ```java SimpleDateFormat sdf = new SimpleDateFormat("dd/MM/yyyy"); Date date = sdf.parse("25/04/2003"); // 将...

    java时间大全.txt

    根据提供的文件信息,本文将详细解析Java中与时间处理相关的几个关键知识点,这些知识点主要集中在如何获取当前时间、格式化日期、以及...在实际开发中,合理运用这些方法能够帮助我们更加高效地处理与时间相关的逻辑。

    android中实时时间显示

    值得注意的是,Android 8.0(API级别26)及更高版本中,建议使用`android.app.AlarmManager.RTC_WAKEUP`或`android.app.JobScheduler`等更高效的方式来调度周期性任务,而不是使用`Handler`或`Timer`,以减少对电池...

    java获取某一时间

    文件中的代码示例使用了 `SimpleDateFormat` 来格式化和解析日期。例如: ```java SimpleDateFormat myFormatter = new SimpleDateFormat("yyyy-MM-dd"); ``` 这行代码创建了一个 `SimpleDateFormat` 对象,指定了...

Global site tag (gtag.js) - Google Analytics