论坛首页 Java企业应用论坛

让人蛋疼的SimpleDateFormat类

浏览 19050 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2011-08-19  
import java.text.ParseException;
import java.util.Date;


import junit.framework.TestCase;
import com.ibm.icu.text.SimpleDateFormat;

public class TestDate extends TestCase{
	private SimpleDateFormat icusdf=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
	private java.text.SimpleDateFormat javaTextsdf=new java.text.SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
	public void testFomat(){
		Date d=new Date();
		System.err.println("com.ibm.icu.text.SimpleDateFormat格式化结果"+icusdf.format(d));
		System.err.println("java.text.SimpleDateFormat格式化结果:"+javaTextsdf.format(d));
	}
	public void testParse() throws ParseException{
		String dateStr="2011-08-19 17:40:00";
		System.err.println("com.ibm.icu.text.SimpleDateFormat解析结果"+icusdf.parse(dateStr));
		System.err.println("java.text.SimpleDateFormat解析结果:"+javaTextsdf.parse(dateStr));
	}

}

	

}

 打印结果:

   com.ibm.icu.text.SimpleDateFormat格式化结果2011-08-19 18:45:10
   java.text.SimpleDateFormat格式化结果:2011-08-19 17:45:10
   com.ibm.icu.text.SimpleDateFormat解析结果Fri Aug 19 16:40:00 CST 2011
   java.text.SimpleDateFormat解析结果:Fri Aug 19 17:40:00 CST 2011

由上面打印结果可以看出,同样的类,同样的方法,就因为包不同格式化或解析后的结果也都不同

得出结果:com.ibm.icu.text.SimpleDateFormat与java.text.SimpleDateFormat比较

  1.fomat()方法,前者比后者大一小时

  2.parse()方法,前者比后者小一小时

  3.当然 java.text.SimpleDateFormat得到的结果是正确的

com.ibm.icu.text.SimpleDateFormat是ICU4J中的一个类。ICU4J 是IBM的国际化开发组件ICU 的Java语言实现版本。为何会发生这种怪异现象,我也没搞清楚,初步猜测是因为ibm这个包的默认时区不同。所以大家用ICU这个SimpleDateFormat时应该注意导入是哪个包

 

   发表时间:2011-08-19  
是否和CST时间相关呢?
转自:
http://www.51testing.com/?uid-248074-action-viewspace-itemid-209865
CST却同时可以代表如下 4 个不同的时区:
Central Standard Time (USA) UT-6:00
Central Standard Time (Australia) UT+9:30
China Standard Time UT+8:00
Cuba Standard Time UT-4:00
0 请登录后投票
   发表时间:2011-08-19  
你不是一个人遇到这样的问题:
这人也是。
http://www.4ucode.com/Study/Topic/1964316

官网有实例,构造函数要求指定locale,如果没有指定就是用defalut,应该是这个default的问题。
http://icu-project.org/apiref/icu4j/com/ibm/icu/text/SimpleDateFormat.html

//-----------------


0 请登录后投票
   发表时间:2011-08-19  
SimpleDateFormat formatter
     = new SimpleDateFormat ("yyyy.MM.dd G 'at' hh:mm:ss a zzz");
0 请登录后投票
   发表时间:2011-08-20  
看默认的“时区”是否一样,如果时区是一样的时间相差一个小时就说明其中一个有问题。
如果时区不一样,那设置同样的时间看时间是否一致。
0 请登录后投票
   发表时间:2011-08-21  
确实很蛋疼啊,用的时候注意了。
0 请登录后投票
   发表时间:2011-08-21  
wuut 写道
确实很蛋疼啊,用的时候注意了。

。。。。。。。
0 请登录后投票
   发表时间:2011-08-21   最后修改:2011-08-21
这个本来就是JDK故意设计的,或者说是bug吧,不能有static,共享的,synchronized 的 SimpleDateFormat。网上有很多报道的,
http://www.cnblogs.com/hyddd/articles/1643978.html
很详细的文章:不使用成员变量/静态成员变量的SimpleDateFormat对象
0 请登录后投票
   发表时间:2011-08-21  
wuliupo 写道
这个本来就是JDK故意设计的,或者说是bug吧,不能有static,共享的,synchronized 的 SimpleDateFormat。网上有很多报道的,
http://www.cnblogs.com/hyddd/articles/1643978.html
很详细的文章:不使用成员变量/静态成员变量的SimpleDateFormat对象


说的是jdk实现不同,不是多线程下面的问题。
0 请登录后投票
   发表时间:2011-08-22  
这个应该是夏令时问题。
0 请登录后投票
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics