Java的SimpleDateFormat常用方法说明整理

转载 2012年03月29日 17:34:02

根据网上文章,进行的整理。

 

关键的参数

  G 年代标志符
  y 年
  M 月
  d 日
  h 时 在上午或下午 (1~12)
  H 时 在一天中 (0~23)
  m 分
  s 秒
  S 毫秒
  E 星期
  D 一年中的第几天
  F 一月中第几个星期几
  w 一年中第几个星期
  W 一月中第几个星期
  a 上午 / 下午 标记符
  k 时 在一天中 (1~24)
  K 时 在上午或下午 (0~11)
  z 时区

 

例子,以及执行结果

import java.text.*;
import java.util.Date;


public class FormatDateTime {

    public static void main(String[] args) {

       ///  打印出2006年11月17日 15时19分56秒
        SimpleDateFormat myFmt=new SimpleDateFormat("yyyy年MM月dd日 HH时mm分ss秒");

       //打印  06/11/17 15:19
        SimpleDateFormat myFmt1=new SimpleDateFormat("yy/MM/dd HH:mm"); 
 
        //2006-11-17 15:19:56
       SimpleDateFormat myFmt2=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
       

     //2006年11月17日 15时19分56秒 星期五
     SimpleDateFormat myFmt3=new SimpleDateFormat("yyyy年MM月dd日 HH时mm分ss秒 E ");

       // 一年中的第 321 天 一年中第46个星期 一月中第3个星期 在一天中15时 CST时区
      SimpleDateFormat myFmt4=new SimpleDateFormat(
                   "一年中的第 D 天 一年中第w个星期 一月中第W个星期 在一天中k时 z时区");
     

     Date now=new Date();
       

System.out.println(myFmt.format(now));
        System.out.println(myFmt1.format(now));
        System.out.println(myFmt2.format(now));
        System.out.println(myFmt3.format(now));
        System.out.println(myFmt4.format(now));

        System.out.println(now.toGMTString());// 17 Nov 2006 07:19:56 GMT
        System.out.println(now.toLocaleString());// 2006-11-17 15:19:56
        System.out.println(now.toString());// Fri Nov 17 15:19:56 CST 2006
    }   
   
}

 

注意事项

在使用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());
   }
 )为了渐少new 的次数而把SimpleDateFormat做成成员或者静态成员,但这样的做法是隐含着错误的,是不
 安全的。如下给出证明:
 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。

其它的还有好多,感兴趣的自己看看吧。

结论:每次使用它的时候现new,或者用一个同步函数把new好的包装起来使用吧。

Java的SimpleDateFormat常用方法说明整理

根据网上文章,进行的整理。 关键的参数   G 年代标志符   y 年   M 月   d 日   h 时 在上午或下午 (1~12)   H 时 在一天中 (0~23)   m 分   s 秒 ...
  • zjc324106
  • zjc324106
  • 2013年12月03日 16:14
  • 541

日期操作类(DateFormat与SimpleDateFormat)的区别和使用详解

日期操作类(DateFormat与SimpleDateFormat)的区别和实例SimpleDateFormat使用详解一、DateFormat类此类是一个日期的格式化类,用来格式化日期。具体日期可以...
  • xx326664162
  • xx326664162
  • 2016年08月15日 10:33
  • 2678

使用Date和SimpleDateFormat类表示时间

在程序开发中经常需要处理日期和时间的相关数据,此时我们可以使用java.util包中的Date类,这个类最主要的作用就是获取当前时间,我们来看一下Date类的使用; 使用Date类的默认无参构造方法创...
  • u013599426
  • u013599426
  • 2016年06月21日 22:14
  • 1291

python常用文件操作方法整理

内容参考自《python变成快速上手》首先明确一点,Windows的路径在python中写为(‘c:\Users\xxx’);mac OS和Linux则写成(‘usr/bin/xxx’)。此处需要用到...
  • lajiasd123
  • lajiasd123
  • 2016年12月07日 13:26
  • 341

Java进阶(二十八)SimpleDateFormat格式化日期问题

SimpleDateFormat格式化日期问题      发现一个问题,经过以下语句处理后,发现12:27:45转换后成为了00:27:45。DateFormat df = null; if(DATE...
  • sunhuaqiang1
  • sunhuaqiang1
  • 2016年05月19日 09:06
  • 45810

《黑马程序员》 日期Data类,日期格式化DateFormat,自定义格式化SimpleDateFormat的使用

public static void main(String[] args) { // getOsDateInstance(); // testDate(); // testDateTim...
  • xfgzss
  • xfgzss
  • 2014年03月06日 13:19
  • 1324

javaweb开发最新整理实用可用的五大框架精简jar包(SSHID)

下面是各大主流框架实用且能跑得起来的扩展jar资源清单: Hibernate4.0.2jar包 Springmvc和权限控制jar包 Mybatise3.0-jar包 Struts2.3...
  • a284065570
  • a284065570
  • 2014年01月04日 15:09
  • 3063

常用关键字整理

Volatile:   Volatile修饰的成员变量在每次被线程访问时,都强迫从主内存中重读该成员变量的值。而且,当成员变量发生变化时,强迫线程将变化值回写到主内存。这样在任何时刻,两个不同的线程...
  • qq_26718271
  • qq_26718271
  • 2017年05月17日 10:38
  • 276

java 日期相关Date、SimpleDateFormat、Calendar区分和使用

一、Date类 类 Date 表示特定的瞬间,精确到毫秒。用距离1970年1月1日00:00:00的毫秒数(long)类型来表示一个特定的时间点,该值可正可负。 Date类中很多方法已经过时,...
  • kaishizhangcheng
  • kaishizhangcheng
  • 2016年09月02日 18:54
  • 3293

java中使用SimpleDateFormat实现字符串和日期的相互转换

java中使用SimpleDateFormat实现字符串和日期的相互转换 import java.text.ParseException; import java.text.SimpleDate...
  • A__17
  • A__17
  • 2016年11月10日 20:58
  • 5557
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Java的SimpleDateFormat常用方法说明整理
举报原因:
原因补充:

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