SimpleDataFormat

转载 2011年01月09日 13:50:00

 

from:http://www.bitscn.com/pdb/java/200703/99939.html

 

在使用SimpleDateFormat的经常会有一些错误的用法,例如如下方式:

public class TestDateFormat{
     
private SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
     
public void method1(){
         sdf.format(
new Date());
     }

     
public void method2(){
         sdf.format(
new Date());
     }

 )

 

 

 

 

 

import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;


public class TestDateFormat{
    
private SimpleDateFormat sdf ;
    
public static void main(String[] args) {
        SimpleDateFormat sdf
= new SimpleDateFormat("yyyy-MM-dd");
        Date date1 
= new Date();
        Date date2 
= new Date(date1.getTime()+1000*60*60*24);
        System.out.println(date1);
        System.out.println(date2);
        Thread thread1 
= new Thread(new Thread1(sdf,date1));
        thread1.start();
        Thread thread2 
= new Thread(new Thread2(sdf,date2));
        thread2.start();
    }

    
}

class Thread1 implements Runnable{
    
private SimpleDateFormat sdf;
    
private Date date;
    
public Thread1(SimpleDateFormat sdf,Date date){
        
this.sdf = sdf;
        
this.date = date;
    }

    
public void run() {
        
for(;;){
            String strDate 
= sdf.format(date);
            
if("2007-02-27".equals(strDate)){
                System.err.println(
"Error: date1="+strDate);
                System.exit(
0);
            }

        }

    }

}

class Thread2 implements Runnable{
    
private SimpleDateFormat sdf;
    
private Date date;
    
public Thread2(SimpleDateFormat sdf,Date date){
        
this.sdf = sdf;
        
this.date = date;
    }

    
public void run() {
        
for(;;){
            String strDate 
= sdf.format(date);
            
if("2007-02-26".equals(strDate)){
                System.err.println(
"Error: date1="+strDate);
                System.exit(
0);
            }

        }

    }

}

 

 

很快,基本几十次就会出现错误。错误原因:
 因为SimpleDateFormat处理复杂,Jdk的实现中使用了成员变量来传递参数,这个就造成在多线程的时候
 会出现错误。上边的程序证明了这个问题。
 
 再看看SimpleDateFormat的Jdk 的Source,有这么一段注释,说明它不是线程安全的。
 Date formats are not synchronized.
 * It is recommended to create separate format instances for each thread.
 * If multiple threads access a format concurrently, it must be synchronized
 
 继续看看Sun自己的网站上。在sun的bug database中
 Bug ID:  4228335  讲的就是这个问题。
 SimpleDateFormat is not threadsafe (one more try) 
 其中有这么几段话值得关注:
 1,
 Aside from the obvious, there are two reasons why this fix should be made:
- The documentation for DateFormat states that a DateFormat object should be used 
multiple times, implying that construction is expensive.  Furthermore,
 no mention is made of SimpleDateFormat's lack of thread-safety.  
 Since for most applications the date formats remain constant, 
 it is very easy to conclude that DateFormats should be application globals. 
 But SimpleDateFormat produces incorrect results when used in this way.
- Bug 4101500, a similar problem with NumberFormat, was fixed.

建议修改这个问题,而且NumberFormat已经修改,解决了这个问题。简单测试了一下NumberFormat确是不出错

2,
Use of a cloned Calendar object in format(), as suggested in JDC comments, 
slows down the execution 30-50%. And it potentially affects footprint because 
of cloned objects. Another approach would be to have a Calendar instance per 
thread. However, this approach will cause problems at the API semantic level due 
to the get/setCalendar methods.
这一段解释了为什么没修改这个问题,一个是保持API不变,另一个是因为Clone比new慢,会损失效率
关于clone与new的快慢,看这里http://www.blogjava.net/dreamstone/archive/2007/02/26/100761.html。

 

SimpleDataFormat

SimpleDataFormat类可以对日期时间进行格式化解析和输出,
  • u013127724
  • u013127724
  • 2014年04月28日 10:36
  • 454

Java—SimpleDateFormat的简单使用

时间的转换,在我们平时的项目里面是很常见的 举个栗子:新闻的客户端,一则新闻,肯定就有这条新闻的发布时间。 不管你这个时间显示是 一分钟前,一小时前,2016年9月30日 14:00 还是09-30 ...
  • Ling912439122
  • Ling912439122
  • 2016年09月30日 15:10
  • 386

格式化时间---SimpleDataFormat

格式化时间 如格式成2015-10-11 08:43:23形式
  • Tom_xiaoxie
  • Tom_xiaoxie
  • 2015年11月27日 10:26
  • 263

解决SimpleDateFormat的线程不安全问题的方法:ThreadLocal

http://bijian1013.iteye.com/blog/1873336 http://blog.csdn.net/vking_wang/article/details/14225379
  • litefish
  • litefish
  • 2015年05月28日 11:40
  • 1263

关于 SimpleDateFormat 的非线程安全问题及其解决方案

SimpleDateFormat 的非线程安全问题
  • zhangming1013
  • zhangming1013
  • 2015年03月02日 15:03
  • 757

基于java里SimpleDateFormat类实现时间戳

import java.util.* ; // 导入需要的工具包 import java.text.* ; // 导入SimpleDateFormat所在的包 class DateTime{  /...
  • zhang434
  • zhang434
  • 2013年12月10日 11:11
  • 1292

SimpleDateFormat 解决非线程安全

SimpleDateFormat类的继承关系: java.text  Class SimpleDateFormat java.lang.Object  |    +---...
  • java_caixs
  • java_caixs
  • 2014年02月14日 15:45
  • 817

ThreadLocal对SimpleDataFormat的使用

package threadLocal; import java.text.DateFormat; import java.text.ParseException; import java.text...
  • Mary881225
  • Mary881225
  • 2017年03月13日 12:00
  • 260

[Java] 日期处理 01 SimpleDataFormat 学习

SimpleDataFormat  Learning.import java.sql.*; import java.text.SimpleDateFormat; public class TestD...
  • robby_chan
  • robby_chan
  • 2014年01月15日 12:59
  • 777

SimpleDataFormat的parse和format

有时候总是将parse和format转换出来的时间格式混淆,记得模棱两可,这里记录一下,直接上代码: package com.caowencao.test.main; impo...
  • Thinkingcao
  • Thinkingcao
  • 2017年07月14日 19:42
  • 198
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:SimpleDataFormat
举报原因:
原因补充:

(最多只允许输入30个字)