本章主要介绍DateFormat。


DateFormat 介绍

DateFormat 的作用是 格式化并解析“日期/时间”。实际上,它是Date的格式化工具,它能帮助我们格式化Date,进而将Date转换成我们想要的String字符串供我们使用
不过DateFormat的格式化Date的功能有限,没有SimpleDateFormat强大;但DateFormat是SimpleDateFormat的父类。所以,我们先对DateFormat有个整体了解,然后再学习SimpleDateFormat。

DateFormat 的作用是格式化Date。它支持格式化风格包括 FULLLONGMEDIUMSHORT 共4种:

(01) DateFormat.SHORT
        完全为数字,如 12.13.52 或 3:30pm
(02) DateFormat.MEDIUM
        较长,如 Jan 12, 1952
(03) DateFormat.LONG
        更长,如 January 12, 1952 或 3:30:32pm
(04) DateFormat.FULL
        是完全指定,如 Tuesday、April 12、1952 AD 或 3:30:42pm PST。

DateFormat 的定义如下

public abstract class NumberFormat extends Format {}

DateFormat 的函数接口

// 默认构造函数
DateFormat() // 非构造函数
Object clone()
boolean equals(Object object)
abstract StringBuffer format(Date date, StringBuffer buffer, FieldPosition field)
final StringBuffer format(Object object, StringBuffer buffer, FieldPosition field)
final String format(Date date)
static Locale[] getAvailableLocales()
Calendar getCalendar()
final static DateFormat getInstance()
final static DateFormat getDateInstance()
final static DateFormat getDateInstance(int style)
final static DateFormat getDateInstance(int style, Locale locale)
final static DateFormat getTimeInstance()
final static DateFormat getTimeInstance(int style)
final static DateFormat getTimeInstance(int style, Locale locale)
final static DateFormat getDateTimeInstance()
final static DateFormat getDateTimeInstance(int dateStyle, int timeStyle)
final static DateFormat getDateTimeInstance(int dateStyle, int timeStyle, Locale locale)
NumberFormat getNumberFormat()
TimeZone getTimeZone()
int hashCode()
boolean isLenient()
Date parse(String string)
abstract Date parse(String string, ParsePosition position)
Object parseObject(String string, ParsePosition position)
void setCalendar(Calendar cal)
void setLenient(boolean value)
void setNumberFormat(NumberFormat format)
void setTimeZone(TimeZone timezone)

注意:DateFormat是一个抽象类。

当我们通过DateFormat的 getInstance(), getDateInstance()和getDateTimeInstance() 获取DateFormat实例时;实际上是返回的SimpleDateFormat对象。
下面的函数实际上都是返回的SimpleDateFormat对象

final static DateFormat getInstance()
final static DateFormat getTimeInstance()
final static DateFormat getTimeInstance(int style)
final static DateFormat getTimeInstance(int style, Locale locale)
final static DateFormat getDateInstance()
final static DateFormat getDateInstance(int style)
final static DateFormat getDateInstance(int style, Locale locale)
final static DateFormat getDateTimeInstance()
final static DateFormat getDateTimeInstance(int dateStyle, int timeStyle)
final static DateFormat getDateTimeInstance(int dateStyle, int timeStyle, Locale locale)

这些函数在SimpleDateFormat.java中的定义如下:

 public static final int FULL = 0;
public static final int LONG = 1;
public static final int MEDIUM = 2;
public static final int SHORT = 3;
public static final int DEFAULT = MEDIUM; public final static DateFormat getInstance() {
return getDateTimeInstance(SHORT, SHORT);
} public final static DateFormat getTimeInstance()
{
return get(DEFAULT, 0, 1, Locale.getDefault());
} public final static DateFormat getTimeInstance(int style)
{
return get(style, 0, 1, Locale.getDefault());
} public final static DateFormat getTimeInstance(int style,
Locale aLocale)
{
return get(style, 0, 1, aLocale);
} public final static DateFormat getDateInstance()
{
return get(0, DEFAULT, 2, Locale.getDefault());
} public final static DateFormat getDateInstance(int style)
{
return get(0, style, 2, Locale.getDefault());
} public final static DateFormat getDateInstance(int style,
Locale aLocale)
{
return get(0, style, 2, aLocale);
} public final static DateFormat getDateTimeInstance()
{
return get(DEFAULT, DEFAULT, 3, Locale.getDefault());
} public final static DateFormat getDateTimeInstance(int dateStyle,
int timeStyle)
{
return get(timeStyle, dateStyle, 3, Locale.getDefault());
} public final static DateFormat
getDateTimeInstance(int dateStyle, int timeStyle, Locale aLocale)
{
return get(timeStyle, dateStyle, 3, aLocale);
} /**
* 获取DateFormat实例,实际上是返回SimpleDateFormat对象。
*
* timeStyle -- 值可以为“FULL”或“LONG”或“MEDIUM”或“SHORT”
* dateStyle -- 值可以为“FULL”或“LONG”或“MEDIUM”或“SHORT”
* flags -- 值可以为“1”或“2”或“3”。
* 1 表示获取“时间样式”
* 2 表示获取“日期样式”
* 3 表示获取“时间和日期样式”
* loc -- locale对象,表示“区域”
*/
private static DateFormat get(int timeStyle, int dateStyle,
int flags, Locale loc) {
if ((flags & 1) != 0) {
if (timeStyle < 0 || timeStyle > 3) {
throw new IllegalArgumentException("Illegal time style " + timeStyle);
}
} else {
timeStyle = -1;
}
if ((flags & 2) != 0) {
if (dateStyle < 0 || dateStyle > 3) {
throw new IllegalArgumentException("Illegal date style " + dateStyle);
}
} else {
dateStyle = -1;
}
try {
// Check whether a provider can provide an implementation that's closer
// to the requested locale than what the Java runtime itself can provide.
LocaleServiceProviderPool pool =
LocaleServiceProviderPool.getPool(DateFormatProvider.class);
if (pool.hasProviders()) {
DateFormat providersInstance = pool.getLocalizedObject(
DateFormatGetter.INSTANCE,
loc,
timeStyle,
dateStyle,
flags);
if (providersInstance != null) {
return providersInstance;
}
} return new SimpleDateFormat(timeStyle, dateStyle, loc);
} catch (MissingResourceException e) {
return new SimpleDateFormat("M/d/yy h:mm a");
}
}

通过上面的代码,我们能够进一步的认识到:DateFormat的作用是格式化Date;帮助我们将Date转换成我们需要的String字符串。DateFormat提供的功能非常有限,它只能支持FULL、LONG、MEDIUM 和 SHORT 这4种格式。而且,我们获取DateFormat实例时,实际上是返回的SimpleDateFormat对象。


DateFormat 实例

下面,我们通过实例学习使用DateFormat的常用API。
源码如下(DateFormatTest.java):

 import java.util.Date;
import java.util.Locale;
import java.text.DateFormat;
import java.text.FieldPosition; /**
* DateFormat 的API测试程序
*
* @author skywang
* @email kuiwu-wang@163.com
*/
public class DateFormatTest { public static void main(String[] args) { // 只显示“时间”:调用getTimeInstance()函数
testGetTimeInstance() ; // 只显示“日期”:调用getDateInstance()函数
testGetDateInstance() ; // 显示“日期”+“时间”:调用getDateTimeInstance()函数
testGetDateTimeInstance() ; // 测试format()函数
testFormat();
} /**
* 测试DateFormat的getTimeInstance()函数
* 它共有3种重载形式:
* (01) getTimeInstance()
* (02) getTimeInstance(int style)
* (03) getTimeInstance(int style, Locale locale)
*
* @author skywang
*/
private static void testGetTimeInstance() {
Date date = new Date(); //Locale locale = new Locale("fr", "FR");
Locale locale = new Locale("zh", "CN"); // 等价于 DateFormat.getTimeInstance( DateFormat.MEDIUM);
DateFormat short0 = DateFormat.getTimeInstance( ); // 参数是:“时间的显示样式”
DateFormat short1 = DateFormat.getTimeInstance( DateFormat.SHORT);
DateFormat medium1 = DateFormat.getTimeInstance( DateFormat.MEDIUM);
DateFormat long1 = DateFormat.getTimeInstance( DateFormat.LONG);
DateFormat full1 = DateFormat.getTimeInstance( DateFormat.FULL); // 参数是:“时间的显示样式” 和 “地区”
DateFormat short2 = DateFormat.getTimeInstance( DateFormat.SHORT, locale);
DateFormat medium2 = DateFormat.getTimeInstance( DateFormat.MEDIUM, locale);
DateFormat long2 = DateFormat.getTimeInstance( DateFormat.LONG, locale);
DateFormat full2 = DateFormat.getTimeInstance( DateFormat.FULL, locale); System.out.println("\n----getTimeInstance ----\n"
+ "(1.0) Empty Param : " + short0.format(date) +"\n"
+ "(2.1) One Param(s) : " + short1.format(date) +"\n"
+ "(2.2) One Param(m) : " + medium1.format(date) +"\n"
+ "(2.3) One Param(l) : " + long1.format(date) +"\n"
+ "(2.4) One Param(f) : " + full1.format(date) +"\n"
+ "(3.1) One Param(s,l): " + short2.format(date) +"\n"
+ "(3.2) One Param(m,l): " + medium2.format(date) +"\n"
+ "(3.3) One Param(l,l): " + long2.format(date) +"\n"
+ "(3.4) One Param(f,l): " + full2.format(date) +"\n"
);
} /**
* 测试DateFormat的getDateTimeInstance()函数
* 它共有3种重载形式:
* (01) getDateInstance()
* (02) getDateInstance(int style)
* (03) getDateInstance(int style, Locale locale)
*/
public static void testGetDateTimeInstance() {
Date date = new Date(); Locale locale = new Locale("zh", "CN"); // 等价于 DateFormat.getDateTimeInstance( DateFormat.MEDIUM);
DateFormat short0 = DateFormat.getDateTimeInstance( ); DateFormat short1 = DateFormat.getDateTimeInstance( DateFormat.SHORT, DateFormat.SHORT);
DateFormat medium1 = DateFormat.getDateTimeInstance( DateFormat.MEDIUM, DateFormat.MEDIUM);
DateFormat long1 = DateFormat.getDateTimeInstance( DateFormat.LONG, DateFormat.LONG);
DateFormat full1 = DateFormat.getDateTimeInstance( DateFormat.FULL, DateFormat.FULL); DateFormat short2 = DateFormat.getDateTimeInstance( DateFormat.SHORT, DateFormat.SHORT, locale);
DateFormat medium2 = DateFormat.getDateTimeInstance( DateFormat.MEDIUM, DateFormat.MEDIUM, locale);
DateFormat long2 = DateFormat.getDateTimeInstance( DateFormat.LONG, DateFormat.LONG, locale);
DateFormat full2 = DateFormat.getDateTimeInstance( DateFormat.FULL, DateFormat.FULL, locale); System.out.println("\n----getDateTimeInstance ----\n"
+ "(1.0) Empty Param : " + short0.format(date) +"\n"
+ "(2.1) One Param(s) : " + short1.format(date) +"\n"
+ "(2.2) One Param(m) : " + medium1.format(date) +"\n"
+ "(2.3) One Param(l) : " + long1.format(date) +"\n"
+ "(2.4) One Param(f) : " + full1.format(date) +"\n"
+ "(3.1) One Param(s,l): " + short2.format(date) +"\n"
+ "(3.2) One Param(m,l): " + medium2.format(date) +"\n"
+ "(3.3) One Param(l,l): " + long2.format(date) +"\n"
+ "(3.4) One Param(f,l): " + full2.format(date) +"\n"
);
} /**
* 测试DateFormat的getDateInstance()函数
* 它共有3种重载形式:
* (01) getDateTimeInstance()
* (02) getDateTimeInstance(int dateStyle, int timeStyle)
* (03) getDateTimeInstance(int dateStyle, int timeStyle, Locale locale)
*/
public static void testGetDateInstance() {
Date date = new Date(); //Locale locale = new Locale("en", "US");
Locale locale = new Locale("zh", "CN"); // 等价于 DateFormat.getDateInstance( DateFormat.MEDIUM);
DateFormat short0 = DateFormat.getDateInstance( ); DateFormat short1 = DateFormat.getDateInstance( DateFormat.SHORT);
DateFormat medium1 = DateFormat.getDateInstance( DateFormat.MEDIUM);
DateFormat long1 = DateFormat.getDateInstance( DateFormat.LONG);
DateFormat full1 = DateFormat.getDateInstance( DateFormat.FULL); DateFormat short2 = DateFormat.getDateInstance( DateFormat.SHORT, locale);
DateFormat medium2 = DateFormat.getDateInstance( DateFormat.MEDIUM, locale);
DateFormat long2 = DateFormat.getDateInstance( DateFormat.LONG, locale);
DateFormat full2 = DateFormat.getDateInstance( DateFormat.FULL, locale); System.out.println("\n----getDateInstance ----\n"
+ "(1.0) Empty Param : " + short0.format(date) +"\n"
+ "(2.1) One Param(s) : " + short1.format(date) +"\n"
+ "(2.2) One Param(m) : " + medium1.format(date) +"\n"
+ "(2.3) One Param(l) : " + long1.format(date) +"\n"
+ "(2.4) One Param(f) : " + full1.format(date) +"\n"
+ "(3.1) One Param(s,l): " + short2.format(date) +"\n"
+ "(3.2) One Param(m,l): " + medium2.format(date) +"\n"
+ "(3.3) One Param(l,l): " + long2.format(date) +"\n"
+ "(3.4) One Param(f,l): " + full2.format(date) +"\n"
); } /**
* 测试DateFormat的format()函数
*/
public static void testFormat() {
Date date = new Date();
StringBuffer sb = new StringBuffer();
FieldPosition field = new FieldPosition(DateFormat.YEAR_FIELD);
DateFormat format = DateFormat.getDateTimeInstance(); sb = format.format(date, sb, field);
System.out.println("\ntestFormat");
System.out.printf("sb=%s\n", sb);
}
}

运行结果:

----getTimeInstance ----
(1.0) Empty Param : 4:54:22 PM
(2.1) One Param(s) : 4:54 PM
(2.2) One Param(m) : 4:54:22 PM
(2.3) One Param(l) : 4:54:22 PM CST
(2.4) One Param(f) : 4:54:22 PM CST
(3.1) One Param(s,l): 下午4:54
(3.2) One Param(m,l): 16:54:22
(3.3) One Param(l,l): 下午04时54分22秒
(3.4) One Param(f,l): 下午04时54分22秒 CST ----getDateInstance ----
(1.0) Empty Param : Jan 23, 2014
(2.1) One Param(s) : 1/23/14
(2.2) One Param(m) : Jan 23, 2014
(2.3) One Param(l) : January 23, 2014
(2.4) One Param(f) : Thursday, January 23, 2014
(3.1) One Param(s,l): 14-1-23
(3.2) One Param(m,l): 2014-1-23
(3.3) One Param(l,l): 2014年1月23日
(3.4) One Param(f,l): 2014年1月23日 星期四 ----getDateTimeInstance ----
(1.0) Empty Param : Jan 23, 2014 4:54:23 PM
(2.1) One Param(s) : 1/23/14 4:54 PM
(2.2) One Param(m) : Jan 23, 2014 4:54:23 PM
(2.3) One Param(l) : January 23, 2014 4:54:23 PM CST
(2.4) One Param(f) : Thursday, January 23, 2014 4:54:23 PM CST
(3.1) One Param(s,l): 14-1-23 下午4:54
(3.2) One Param(m,l): 2014-1-23 16:54:23
(3.3) One Param(l,l): 2014年1月23日 下午04时54分23秒
(3.4) One Param(f,l): 2014年1月23日 星期四 下午04时54分23秒 CST testFormat
sb=Jan 23, 2014 4:54:23 PM

OK。至此,对DateFormat的学习到此为止。接下来,我们开始学习SimpleDateFormat,它才是格式化Date需要重点了解的。


更多内容

Java Calendar,Date,DateFormat,TimeZone,Locale等时间相关内容的认知和使用(1) Calendar

Java Calendar,Date,DateFormat,TimeZone,Locale等时间相关内容的认知和使用(2) 自己封装的Calendar接口

Java Calendar,Date,DateFormat,TimeZone,Locale等时间相关内容的认知和使用(3) Date

Java Calendar,Date,DateFormat,TimeZone,Locale等时间相关内容的认知和使用(4) DateFormat

Java Calendar,Date,DateFormat,TimeZone,Locale等时间相关内容的认知和使用(4) DateFormat的更多相关文章

  1. Java Calendar,Date,DateFormat,TimeZone,Locale等时间相关内容的认知和使用(1) Calendar

    Java 操作日期/时间,往往会涉及到Calendar,Date,DateFormat这些类. 最近决定把这些内容系统的整理一下,这样以后使用的时候,会更得心应手.本章的内容是主要讲解“Java时间框 ...

  2. Java Calendar,Date,DateFormat,TimeZone,Locale等时间相关内容的认知和使用(2) 自己封装的Calendar接口

    本章主要是收藏一些常用的类和接口,包括:万年历(农历.阳历节日.阴历节日).自定义的Calendar接口. 万年历 源码如下(ChineseCalendar.java): package com.vi ...

  3. Java Calendar,Date,DateFormat,TimeZone,Locale等时间相关内容的认知和使用(3) Date

    本章主要介绍Date类,并通过示例学习如何使用它.最后,讲解一下UTC.GMT和时区的关系. Date 介绍 Date 定义 public class Date implements java.io. ...

  4. Java Calendar,Date,DateFormat,TimeZone,Locale等时间相关内容的认知和使用(5) SimpleDateFormat

    本章介绍SimpleDateFormat. SimpleDateFormat 介绍 SimpleDateFormat 是一个格式化Date 以及 解析日期字符串 的工具.它的最常用途是,能够按照指定的 ...

  5. Java Calendar,Date,DateFormat,TimeZone,Locale等时间相关内容的认知和使用(6) Locale

    本章介绍Locale. 1 Locale 介绍 Locale 表示地区.每一个Locale对象都代表了一个特定的地理.政治和文化地区. 在操作 Date, Calendar等表示日期/时间的对象时,经 ...

  6. Java Calendar,Date,DateFormat,TimeZone,Locale等时间相关内容的认知和使用(7) TimeZone

    本章介绍TimeZone. TimeZone 简介 TimeZone 表示时区偏移量,也可以计算夏令时.在操作 Date, Calendar等表示日期/时间的对象时,经常会用到TimeZone:因为不 ...

  7. Java Calendar Date使用总结

    Java Calendar Date使用总结 package cn.outofmemory.codes.Date; import java.util.Calendar; import java.uti ...

  8. java Calendar Date 获取指定日期所在月或年的第一天和最后一天

    一.获取传入日期所在月的第一天 public static Date getFirstDayDateOfMonth(final Date date) { final Calendar cal = Ca ...

  9. 常用类一一时间处理相关类一一java.util.Tomezone(java.util.Calendar , java.util.Date , java.text.DateFormat)

    时间处理相关类 时间是一个一维的东东.所以,我们需要一把刻度尺来区表达和度量时间.在计算机世界,我们把1970 年 1 月 1 日 00:00:00定为基准时间,每个度量单位是毫秒(1秒的千分之一). ...

随机推荐

  1. nor flash 和 nand flash

    NOR Flash是很常见的一种存储芯片,数据掉电不会丢失,支持Execut On Chip,即程序可以直接在FLASH片内执行(这意味着存储在NOR FLash上的程序不需要复制到RAM就可以直接运 ...

  2. 在VMware上安装Ubuntu软件步骤与遇到的相关问题及解决方案

    图解演示环境版本: 本机系统: WIN10 虚拟机:VMware Workstation 12(中文版) 安装目标:Ubuntu Desktop 12.04 LTS  (请点击这里)先下载好iso镜像 ...

  3. python2脚本批量转成python3

    #查看 模块的安装路径 import tools print (tools.__file__) #进入cmd,然后python 2to3.py -w 需要批量转换的文件所在的路径#参考:http:// ...

  4. Java学习--编译器javac

    Java的源程序为.java文件, 编译后生成.class文件(字节码文件); javac(java compiler的简写)是java语言的编译器. Hello.java public class ...

  5. 深入迁出mybatis系列

    本系列教程均源于南柯梦,经好库文摘转发,感谢南柯梦的辛苦整理. 深入迁出mybatis系列 深入浅出Mybatis系列(一)---Mybatis入门 深入浅出Mybatis系列(二)---配置简介(m ...

  6. js字符串操作之substr与substring

    substr和substring两个都是截取字符串的. 两者有相同点,如果只是写一个参数,两者的作用都是一样的:就是截取字符串当前下标以后直到字符串最后的字符串片段. 例如: `var a=" ...

  7. 解决Flume向Kafka多分区写数据

    1  问题背景 Flume向kafka发布数据时,发现kafka接收到的数据总是在一个partition中,而我们希望发布来的数据在所有的partition平均分布 2 解决办法 Flume的官方文档 ...

  8. Ubuntu系统无法获得锁/var/lib/dpkg/lock - open (11: 资源暂时不可用)的解决方案

    Ubuntu系统无法获得锁/var/lib/dpkg/lock - open (11: 资源暂时不可用)的解决方案     问题 使用Ubuntu打开终端时,输入带有sudo apt-get 命令行是 ...

  9. CentOS和Windows下配置MySQL远程访问的教程

    CentOS和Windows下配置MySQL远程访问的教程   一.前言 由于实验在云服务器上跑的结果不是很理想.所以,现在切换到局域网服务器.因此,需要重新配置 Windows 服务器和 CentO ...

  10. 007.KVM虚机时间-快照管理

    一 快照管理 1.1 创建快照 [root@kvm-host ~]# virsh snapshot-create vm03-centos6.8 [root@kvm-host ~]# virsh sna ...