这篇文章不是系统的学习,是阅读一些文章,然后总结汇总的。

一:SimpleDateFormat类

1.介绍

  SimpleDateFormat 是一个以国别敏感的方式格式化和分析数据的具体类。 它允许格式化 (date -> text)、语法分析 (text -> date)和标准化。

  SimpleDateFormat 允许以为日期-时间格式化选择任何用户指定的方式启动。

  但是,希望用 DateFormat 中的 getTimeInstance、 getDateInstance 或 getDateTimeInstance 创建一个日期-时间格式化程序。 每个类方法返回一个以缺省格式化方式初始化的日期/时间格式化程序。 可以根据需要用 applyPattern 方法修改格式化方式。

2.继承关系

  java.lang.Object
     |
     +----java.text.Format
             |
             +----java.text.DateFormat
                     |
                     +----java.text.SimpleDateFormat

3.语法

  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 时区

二:案例一

1.format

  日期对象产生日期字符串。

 package com.cao.it;

 import java.text.SimpleDateFormat;
import java.util.Date; public class Test1 {
public static void main(String[] args) {
SimpleDateFormat myFmt = new SimpleDateFormat("yyyy年MM月dd日 HH时mm分ss秒");
SimpleDateFormat myFmt1 = new SimpleDateFormat("yy/MM/dd HH:mm");
SimpleDateFormat myFmt2 = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");// 等价于now.toLocaleString()
SimpleDateFormat myFmt3 = new SimpleDateFormat("yyyy年MM月dd日 HH时mm分ss秒 E");
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("======"); System.out.println(now.toGMTString());
System.out.println(now.toLocaleString()); //这个方法产生的效果和上面的一样,不建议使用这个方法
System.out.println(now.toString());
}
}

2.效果

  

3.对上面的一个补充

  format后返回的是String。

 package com.cao.it;
import java.text.SimpleDateFormat;
import java.util.Date; public class Test2 {
public static String toLongDateString(Date dt){
SimpleDateFormat myFmt=new SimpleDateFormat("yyyy年MM月dd日 HH时mm分ss秒 E ");
return myFmt.format(dt);
} public static String toLongTimeString(Date dt){
SimpleDateFormat myFmt=new SimpleDateFormat("HH mm ss SSSS");
return myFmt.format(dt);
} public static void main(String[] args) {
Date now=new Date();
System.out.println(toLongDateString(now));
System.out.println(toLongTimeString(now));
}
}

4.效果

  

三:案例二

1.parse

  字符串中提取日期。

 package com.cao.it;

 import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date; class Test3 {
public static void main(String[] args) throws Exception {
String str = "2009-02-15 09:21:35.345";
SimpleDateFormat sdf1 = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss.SSS");
SimpleDateFormat sdf2 = new SimpleDateFormat("yyyy年MM月dd日 hh时mm分ss秒SSS毫秒"); //必须使用相同的格式才好进行解析
Date date = sdf1.parse(str); // 提取格式中的日期
System.out.println("转换之前的日期:" + date); String newStr1 = sdf1.format(date); // 改变格式
System.out.println("转换之后的日期:" + newStr1); String newStr2 = sdf2.format(date); // 改变格式
System.out.println("转换之后的日期:" + newStr2);
}
}

2.效果

  

四:Calendar

1.程序

 package com.cao.it;

 import java.util.Calendar;

 public class Test4 {
public static void main(String[] args) {
Calendar date=Calendar.getInstance();
int day=date.get(Calendar.HOUR_OF_DAY ); //得到24小时机制的
int hour=date.get(Calendar.HOUR); //得到12小时机制的
System.out.println(day);
System.out.println(hour);
}
}

2.效果

  

五:安全问题

参考文档:https://www.cnblogs.com/peida/archive/2013/05/31/3070790.html

1.问题

  DateFormat 和 SimpleDateFormat 类不都是线程安全的,在多线程环境下调用 format() 和 parse() 方法应该使用同步代码来避免问题。

2.下面是解决方法一

  在需要用到SimpleDateFormat 的地方新建一个实例,不管什么时候,将有线程安全问题的对象由共享变为局部私有都能避免多线程问题,不过也加重了创建对象的负担。

  在一般情况下,这样其实对性能影响比不是很明显的。

 package com.cao.it;

 import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date; public class Test5 {
/**
* 两个静态方法
* 在要使用SimpleDateFormat的时候才创建类对象
*/
public static String formatDate(Date date,String parent)throws ParseException{
SimpleDateFormat sdf = new SimpleDateFormat(parent);
return sdf.format(date);
} public static Date parse(String strDate,String parent) throws ParseException{
SimpleDateFormat sdf = new SimpleDateFormat(parent);
return sdf.parse(strDate);
}
/**
* 测试主类
*/
public static void main(String[] args) throws ParseException {
String parent="yyyy-MM-dd HH:mm:ss";
//
Date date=new Date();
String dateStr=formatDate(date,parent);
System.out.println(dateStr);
//
String strDate="2017-12-27 21:56:36";
Date mydate=parse(strDate, parent);
System.out.println(date);
System.out.println(date.toLocaleString()); }
}

3.效果

  

4.下面是解决方法二

  当线程较多时,当一个线程调用该方法时,其他想要调用此方法的线程就要block,多线程并发量大的时候会对性能有一定的影响。

  我认为,这个不适合写成工具类,因为sdf中的格式被固定了。

 package com.cao.it;

 import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date; public class Test6 {
private static SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
public static String format(Date date) {
synchronized (sdf) {
return sdf.format(date);
}
}
public static Date parse(String dateStr) throws ParseException {
synchronized(sdf) {
return sdf.parse(dateStr);
}
}
/**
* 测试主方法
*/
public static void main(String[] args) {
Date date=new Date();
String datestr=format(date);
System.out.println(datestr);
}
}

5.下面是解决方法三

  使用ThreadLocal, 也是将共享变量变为独享,线程独享肯定能比方法独享在并发环境中能减少不少创建对象的开销。如果对性能要求比较高的情况下,一般推荐使用这种方法。

 package com.cao.it;

 import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date; public class Test7 {
// private static final String date_format = "yyyy-MM-dd HH:mm:ss";
private static ThreadLocal<DateFormat> threadLocal = new ThreadLocal<DateFormat>(); /**
*获取SimpleDateFormat
*/
public static DateFormat getFormat(String date_format)
{
DateFormat df = threadLocal.get();
if(df==null){
df = new SimpleDateFormat(date_format);
threadLocal.set(df);
}
return df;
} public static String formatDate(Date date,String date_format) throws ParseException {
return getFormat(date_format).format(date);
} public static Date parse(String strDate,String date_format) throws ParseException {
return getFormat(date_format).parse(strDate);
} /**
* 测试主类
* @throws ParseException
*/
public static void main(String[] args) throws ParseException {
Date date=new Date();
String parent="yyyy--mm--dd HH:mm:ss";
String dateStr=formatDate(date, parent);
System.out.println(dateStr); } }

6.效果

  

7.总结

  如果在必要的时候,追求那么一点性能提升的话,可以考虑用方法三,用ThreadLocal做缓存。

关于日期转换的知识点(SimpleDateFormat)的更多相关文章

  1. 使用DateUtils和DateFormatUtils处理时间日期转换与SimpleDateFormat的区别

    在Apache Commons项目的Lang里面,有两个类:DateUtils和DateFormatUtils,专门用于处理时间日期转换.它们在 org.apache.commons.lang.tim ...

  2. springMvc的日期转换之二

    方式一:使用@InitBinder注解实现日期转换 前台页面: 后台打印: 方式二:处理多种日期格式类型之间的转换 采用方式:由于binder.registerCustomEditor(Date.cl ...

  3. Struts2中Date日期转换的问题

      今天跑程序的时候莫名其妙的出现了下面的一个异常: java.lang.NoSuchMethodException:com.ca.agent.model.mybatis.ApprovalInforC ...

  4. struts1日期转换处理

    问题场景 最近在维护公司旧的系统(用的struts1框架)的时候,在日期处理的时候,我将日期设定为Date类型,结果报以下错误: javax.servlet.ServletException: Bea ...

  5. java中的日期转换

    在java中有两种Date对象,一种是java.sql.Date,另一种是java.util.Date 一.java.sql.Date对象: 这种Date对象使用了进行数据库操作的,它对应了数据库中的 ...

  6. 日期转换工具类 CommUtil.java

    package com.util; import java.text.ParseException; import java.text.SimpleDateFormat; import java.ut ...

  7. 日期转换类 DateConverter.java

    package com.util; import java.text.DateFormat; import java.text.SimpleDateFormat; import java.util.D ...

  8. java日期格式大全 format SimpleDateFormat(转)

    java日期格式大全 format SimpleDateFormat   /**    * 字符串转换为java.util.Date<br>    * 支持格式为 yyyy.MM.dd G ...

  9. java日期转换

    在java开发过程中,时间的转换时必须掌握的=========下面把时间转换做个总结,有可能不是很全面 时间格式只有两种 yyyy-MM-DD yyyy/MM/DD 时间的类型:字符串类型.sql类型 ...

随机推荐

  1. 【转】SPI总线协议

    SPI总线协议 By Xiaomin | April 17, 2016| 技术 概述 SPI(Serial Peripheral Interface)总线是主要应用于嵌入式系统内部通信的串行同步传输总 ...

  2. 【bzoj1492】 NOI2007—货币兑换Cash

    http://www.lydsy.com/JudgeOnline/problem.php?id=1492 (题目链接) 题意 两种金券,金券按照比例交易:买入时,将投入的资金购买比例为$rate[i] ...

  3. ASP.NET MVC学习之Log4Net配置(日志记录)

    Log4Net配置笔记---- 首先,添加对log4net.dll的引用. 在Web.config文件下的Configuration节点下添加Log4Net的配置信息: <!--Log4Net配 ...

  4. list对象指针与指针类型list

    #include <string> #include <cctype> #include <algorithm> #include <iostream> ...

  5. Redis记录-Redis介绍

    Redis是一个开源,高级的键值存储和一个适用的解决方案,用于构建高性能,可扩展的Web应用程序. Redis有三个主要特点,使它优越于其它键值数据存储系统 - Redis将其数据库完全保存在内存中, ...

  6. Codeforces Round #547 (Div. 3) D

    http://codeforces.com/contest/1141/problem/D 题目大意: 鞋子匹配,用一个小写字母表示一种颜色.L[i]表示左脚的颜色,R[i]表示右脚的颜色,只有当L[i ...

  7. Spring Mvc 一个接口多个继承; (八)

    在 spring 注解实现里,一个接口一般是不能多继承的! 除非在 bean 配置文件里有 针对这个 实现类的配置: <beans:bean id="icService" c ...

  8. Sortable.js

    拖拽的时候主要由这几个事件完成, ondragstart 事件:当拖拽元素开始被拖拽的时候触发的事件,此事件作用在被拖曳元素上 ondragenter 事件:当拖曳元素进入目标元素的时候触发的事件,此 ...

  9. Strange Queries(莫队)

    题目 You are given an array with n integers a1, a2, ..., an, and q queries to answer. Each query consi ...

  10. lucene中文分词——(四)

    1.分析器的执行过程: