public static void main(String[] args) {
/*
* Date:
*/
// 创建一个日期对象。
Date date = new Date();
System.out.println(date);// Mon Mar 25 11:11:19 CST 2013
long time = System.currentTimeMillis();
System.out.println(time);// 1364181181171
/*
* 日期对象和毫秒值之间的转换。 毫秒值转成-->日期对象。 1,new Date(long);构造函数形式。
* 2,setTime(long): 获取日期对象,可以通过对象的方法对该日期进行指定字段的操作。
*/
date.setTime(1364181181171l);
System.out.println(date);
/*
* 日期对象转成毫秒值。 通常用于进行运算。 通过Date对象的getTime方法。
*/
System.out.println(date.getTime());
}
public class DateFormatDemo {
public static void main(String[] args) throws ParseException {
Date date = new Date();
/*
* 想要对日期对象的字符串表现形式进行指定格式的显示。
* 找到了DateFormat类。
* 格式化:日期-->文本 ,日期对象--->字符串。 String format(date)
* 解析:文本-->日期,日期格式的字符串-->日期对象。Date parse(String);
*/
//DateFormat虽然是抽象类,但是该类有提供静态工厂方法(用于获取日期格式实例的方法)。
DateFormat dateFormat = DateFormat.getDateInstance();//2013-3-25
// System.out.println(dateFormat);//java.text.SimpleDateFormat@ef7951d7
dateFormat = DateFormat.getDateInstance(DateFormat.FULL);//指定Full格式。2013年3月25日 星期一
System.out.println(dateFormat.format(date)+"full");
dateFormat = DateFormat.getDateInstance(DateFormat.LONG);//指定Long格式。2013年3月25日
System.out.println(dateFormat.format(date)+"LONG");
dateFormat = DateFormat.getDateInstance(DateFormat.MEDIUM);//指定MEDIUM格式。2013-3-25 默认格式。
System.out.println(dateFormat.format(date)+"Medium");
dateFormat = DateFormat.getDateInstance(DateFormat.SHORT);//指定SHORT格式。13-3-25
System.out.println(dateFormat.format(date)+"Short");
dateFormat = DateFormat.getDateTimeInstance(DateFormat.FULL,DateFormat.FULL);
//2013年3月25日 星期一 上午11时42分14秒 CST
System.out.println(dateFormat.format(date)+"dataTime");
System.err.println("------------------------------------------------------");
//如何通过自定义的格式进行格式化?需要自己创建SimpleDateFormat对象。
//通过其构造函数将自定义的模式进行对象封装。
dateFormat = new SimpleDateFormat("yyyy/MM/dd hh:mm:ss");//2013/03/25 11:49:33
//通过format方法对日期对象进行格式化。
System.out.println(dateFormat.format(date));
//对日期格式字符串进行解析。
String str_Date2 = "2011年8月5日";
DateFormat dateFormat2 =DateFormat.getDateInstance(DateFormat.LONG);
Date date2 = dateFormat2.parse(str_Date2);
System.out.println(date2);
}
}
public class DateFormatDemo {
public static void main(String[] args) throws ParseException {
Date date = new Date();
/*
* 想要对日期对象的字符串表现形式进行指定格式的显示。
* 找到了DateFormat类。
* 格式化:日期-->文本 ,日期对象--->字符串。 String format(date)
* 解析:文本-->日期,日期格式的字符串-->日期对象。Date parse(String);
*/
//DateFormat虽然是抽象类,但是该类有提供静态工厂方法(用于获取日期格式实例的方法)。
DateFormat dateFormat = DateFormat.getDateInstance();//2013-3-25
// System.out.println(dateFormat);//java.text.SimpleDateFormat@ef7951d7
dateFormat = DateFormat.getDateInstance(DateFormat.FULL);//指定Full格式。2013年3月25日 星期一
System.out.println(dateFormat.format(date)+"full");
dateFormat = DateFormat.getDateInstance(DateFormat.LONG);//指定Long格式。2013年3月25日
System.out.println(dateFormat.format(date)+"LONG");
dateFormat = DateFormat.getDateInstance(DateFormat.MEDIUM);//指定MEDIUM格式。2013-3-25 默认格式。
System.out.println(dateFormat.format(date)+"Medium");
dateFormat = DateFormat.getDateInstance(DateFormat.SHORT);//指定SHORT格式。13-3-25
System.out.println(dateFormat.format(date)+"Short");
dateFormat = DateFormat.getDateTimeInstance(DateFormat.FULL,DateFormat.FULL);
//2013年3月25日 星期一 上午11时42分14秒 CST
System.out.println(dateFormat.format(date)+"dataTime");
System.err.println("------------------------------------------------------");
//如何通过自定义的格式进行格式化?需要自己创建SimpleDateFormat对象。
//通过其构造函数将自定义的模式进行对象封装。
dateFormat = new SimpleDateFormat("yyyy/MM/dd hh:mm:ss");//2013/03/25 11:49:33
//通过format方法对日期对象进行格式化。
System.out.println(dateFormat.format(date));
//对日期格式字符串进行解析。
String str_Date2 = "2011年8月5日";
DateFormat dateFormat2 =DateFormat.getDateInstance(DateFormat.LONG);
Date date2 = dateFormat2.parse(str_Date2);
System.out.println(date2);
}
}
java.text
类 DateFormat
java.lang.Object java.text.Format java.text.DateFormat
-
所有已实现的接口:
- Serializable, Cloneable
-
直接已知子类:
- SimpleDateFormat
public abstract class DateFormat extends Format
DateFormat 是日期/时间格式化子类的抽象类,它以与语言无关的方式格式化并解析日期或时间。日期/时间格式化子类(如 SimpleDateFormat)允许进行格式化(也就是日期 -> 文本)、解析(文本-> 日期)和标准化。将日期表示为 Date
对象,或者表示为从 GMT(格林尼治标准时间)1970 年 1 月 1 日 00:00:00 这一刻开始的毫秒数。
DateFormat 提供了很多类方法,以获得基于默认或给定语言环境和多种格式化风格的默认日期/时间 Formatter。格式化风格包括 FULL、LONG、MEDIUM 和 SHORT。方法描述中提供了使用这些风格的更多细节和示例。
DateFormat 可帮助进行格式化并解析任何语言环境的日期。对于月、星期,甚至日历格式(阴历和阳历),其代码可完全与语言环境的约定无关。
要格式化一个当前语言环境下的日期,可使用某个静态工厂方法:
myString = DateFormat.getDateInstance().format(myDate);
如果格式化多个日期,那么获取该格式并多次使用它是更为高效的做法,这样系统就不必多次获取有关环境语言和国家/地区约定的信息了。
DateFormat df = DateFormat.getDateInstance(); for (int i = 0; i < myDate.length; ++i) { output.println(df.format(myDate[i]) + "; "); }
要格式化不同语言环境的日期,可在 getDateInstance() 的调用中指定它。
DateFormat df = DateFormat.getDateInstance(DateFormat.LONG, Locale.FRANCE);
还可使用 DateFormat 进行解析。
myDate = df.parse(myString);
使用 getDateInstance 来获取该国家/地区的标准日期格式。另外还提供了一些其他静态工厂方法。使用 getTimeInstance 可获取该国家/地区的时间格式。使用 getDateTimeInstance 可获取日期和时间格式。可以将不同选项传入这些工厂方法,以控制结果的长度(从 SHORT 到 MEDIUM 到 LONG 再到 FULL)。确切的结果取决于语言环境,但是通常:
- SHORT 完全为数字,如 12.13.52 或 3:30pm
- MEDIUM 较长,如 Jan 12, 1952
- LONG 更长,如 January 12, 1952 或 3:30:32pm
- FULL 是完全指定,如 Tuesday、April 12、1952 AD 或 3:30:42pm PST。
如果愿意,还可以在格式上设置时区。如果想对格式化或解析施加更多的控制(或者给予用户更多的控制),可以尝试将从工厂方法所获取的 DateFormat 强制转换为 SimpleDateFormat。这适用于大多数国家/地区;只是要记住将其放入一个 try 代码块中,以防遇到特殊的格式。
还可以使用借助 ParsePosition 和 FieldPosition 的解析和格式化方法形式来
- 逐步地解析字符串的各部分。
- 对齐任意特定的字段,或者找出字符串在屏幕上的选择位置。
同步
日期格式不是同步的。建议为每个线程创建独立的格式实例。如果多个线程同时访问一个格式,则它必须保持外部同步。
-
另请参见:
-
Format
,NumberFormat
,SimpleDateFormat
,Calendar
,GregorianCalendar
,TimeZone
, 序列化表格
嵌套类摘要 | |
---|---|
static class | DateFormat.Field 定义了各种常量,这些常量用作 DateFormat.formatToCharacterIterator 所返回的 AttributedCharacterIterator 中的属性键和 FieldPosition 中的字段标识符。 |
字段摘要 | |
---|---|
static int | AM_PM_FIELD 用于对齐 AM_PM 字段的有用常量。 |
protected Calendar | calendar DateFormat 使用 calendar 来生成实现日期和时间格式化所需的时间字段值。 |
static int | DATE_FIELD 用于对齐 DATE 字段的有用常量。 |
static int | DAY_OF_WEEK_FIELD 用于对齐 DAY_OF_WEEK 字段的有用常量。 |
static int | DAY_OF_WEEK_IN_MONTH_FIELD 用于对齐 DAY_OF_WEEK_IN_MONTH 字段的有用常量。 |
static int | DAY_OF_YEAR_FIELD 用于对齐 DAY_OF_YEAR 字段的有用常量。 |
static int | DEFAULT 用于默认模式的常量。 |
static int | ERA_FIELD 用于对齐 ERA 字段的有用常量。 |
static int | FULL 用于 FULL 模式的常量。 |
static int | HOUR_OF_DAY0_FIELD 用于对齐从 0 开始的 HOUR_OF_DAY 字段的有用常量。 |
static int | HOUR_OF_DAY1_FIELD 用于对齐从 1 开始的 HOUR_OF_DAY 字段的有用常量。 |
static int | HOUR0_FIELD 用于对齐从 0 开始的 HOUR 字段的有用常量。 |
static int | HOUR1_FIELD 用于对齐从 1 开始的 HOUR 字段的有用常量。 |
static int | LONG 用于 LONG 模式的常量。 |
static int | MEDIUM 用于 MEDIUM 模式的常量。 |
static int | MILLISECOND_FIELD 用于对齐 MILLISECOND 字段的有用常量。 |
static int | MINUTE_FIELD 用于对齐 MINUTE 字段的有用常量。 |
static int | MONTH_FIELD 用于对齐 MONTH 字段的有用常量。 |
protected NumberFormat | numberFormat 数字格式器, DateFormat 用其来格式化日期和时间中的数字。 |
static int | SECOND_FIELD 用于对齐 SECOND 字段的有用常量。 |
static int | SHORT 用于 SHORT 模式的常量。 |
static int | TIMEZONE_FIELD 用于对齐 TIMEZONE 字段的有用常量。 |
static int | WEEK_OF_MONTH_FIELD 用于对齐 WEEK_OF_MONTH 字段的有用常量。 |
static int | WEEK_OF_YEAR_FIELD 用于对齐 WEEK_OF_YEAR 字段的有用常量。 |
static int | YEAR_FIELD 用于对齐 YEAR 字段的有用常量。 |
构造方法摘要 | |
---|---|
protected | DateFormat() 创建一个新的 DateFormat。 |
方法摘要 | |
---|---|
Object | clone() 重写 Cloneable |
boolean | equals(Object obj) 重写 equals |
String | format(Date date) 将一个 Date 格式化为日期/时间字符串。 |
abstract StringBuffer | format(Date date, StringBuffer toAppendTo, FieldPosition fieldPosition) 将一个 Date 格式化为日期/时间字符串。 |
StringBuffer | format(Object obj, StringBuffer toAppendTo, FieldPosition fieldPosition) 重写 Format。 |
static Locale[] | getAvailableLocales() 返回所有语言环境的数组,此类的 get*Instance 方法可以为其返回已本地化的实例。 |
Calendar | getCalendar() 获取与此日期/时间格式器关联的日历。 |
static DateFormat | getDateInstance() 获取日期格式器,该格式器具有默认语言环境的默认格式化风格。 |
static DateFormat | getDateInstance(int style) 获取日期格式器,该格式器具有默认语言环境的给定格式化风格。 |
static DateFormat | getDateInstance(int style, Locale aLocale) 获取日期格式器,该格式器具有给定语言环境的给定格式化风格。 |
static DateFormat | getDateTimeInstance() 获取日期/时间格式器,该格式器具有默认语言环境的默认格式化风格。 |
static DateFormat | getDateTimeInstance(int dateStyle, int timeStyle) 获取日期/时间格式器,该格式器具有默认语言环境的给定日期和时间格式化风格。 |
static DateFormat | getDateTimeInstance(int dateStyle, int timeStyle, Locale aLocale) 获取日期/时间格式器,该格式器具有给定语言环境的给定格式化风格。 |
static DateFormat | getInstance() 获取为日期和时间使用 SHORT 风格的默认日期/时间格式器。 |
NumberFormat | getNumberFormat() 获取此日期/时间格式器用于格式化和解析时间的数字格式器。 |
static DateFormat | getTimeInstance() 获取时间格式器,该格式器具有默认语言环境的默认格式化风格。 |
static DateFormat | getTimeInstance(int style) 获取时间格式器,该格式器具有默认语言环境的给定格式化风格。 |
static DateFormat | getTimeInstance(int style, Locale aLocale) 获取时间格式器,该格式器具有给定语言环境的给定格式化风格。 |
TimeZone | getTimeZone() 获取时区。 |
int | hashCode() 重写 hashCode |
boolean | isLenient() 判断日期/时间解析是否为不严格的。 |
Date | parse(String source) 从给定字符串的开始解析文本,以生成一个日期。 |
abstract Date | parse(String source, ParsePosition pos) 根据给定的解析位置开始解析日期/时间字符串。 |
Object | parseObject(String source, ParsePosition pos) 解析字符串中的文本,以生成一个 Date 。 |
void | setCalendar(Calendar newCalendar) 设置此日期格式所使用的日历。 |
void | setLenient(boolean lenient) 指定日期/时间解析是否不严格。 |
void | setNumberFormat(NumberFormat newNumberFormat) 允许用户设置数字格式器。 |
void | setTimeZone(TimeZone zone) 为此 DateFormat 对象的日历设置时区。 |
java.text
类 SimpleDateFormat
java.lang.Object java.text.Format java.text.DateFormat java.text.SimpleDateFormat
-
所有已实现的接口:
- Serializable, Cloneable
public class SimpleDateFormat extends DateFormat
SimpleDateFormat
是一个以与语言环境有关的方式来格式化和解析日期的具体类。它允许进行格式化(日期 -> 文本)、解析(文本 -> 日期)和规范化。
SimpleDateFormat
使得可以选择任何用户定义的日期-时间格式的模式。但是,仍然建议通过 DateFormat
中的 getTimeInstance
、getDateInstance
或 getDateTimeInstance
来创建日期-时间格式器。每一个这样的类方法都能够返回一个以默认格式模式初始化的日期/时间格式器。可以根据需要使用 applyPattern
方法来修改格式模式。有关使用这些方法的更多信息,请参阅 DateFormat
。
日期和时间模式
日期和时间格式由日期和时间模式 字符串指定。在日期和时间模式字符串中,未加引号的字母 'A'
到 'Z'
和 'a'
到 'z'
被解释为模式字母,用来表示日期或时间字符串元素。文本可以使用单引号 ('
) 引起来,以免进行解释。"''"
表示单引号。所有其他字符均不解释;只是在格式化时将它们简单复制到输出字符串,或者在解析时与输入字符串进行匹配。
定义了以下模式字母(所有其他字符 'A'
到 'Z'
和 'a'
到 'z'
都被保留):
模式字母通常是重复的,其数量确定其精确表示:
字母 日期或时间元素 表示 示例 G
Era 标志符 Text AD
y
年 Year 1996
;96
M
年中的月份 Month July
;Jul
;07
w
年中的周数 Number 27
W
月份中的周数 Number 2
D
年中的天数 Number 189
d
月份中的天数 Number 10
F
月份中的星期 Number 2
E
星期中的天数 Text Tuesday
;Tue
a
Am/pm 标记 Text PM
H
一天中的小时数(0-23) Number 0
k
一天中的小时数(1-24) Number 24
K
am/pm 中的小时数(0-11) Number 0
h
am/pm 中的小时数(1-12) Number 12
m
小时中的分钟数 Number 30
s
分钟中的秒数 Number 55
S
毫秒数 Number 978
z
时区 General time zone Pacific Standard Time
;PST
;GMT-08:00
Z
时区 RFC 822 time zone -0800
- Text: 对于格式化来说,如果模式字母的数量大于等于 4,则使用完全形式;否则,在可用的情况下使用短形式或缩写形式。对于解析来说,两种形式都是可接受的,与模式字母的数量无关。
- Number: 对于格式化来说,模式字母的数量是最小的数位,如果数位不够,则用 0 填充以达到此数量。对于解析来说,模式字母的数量被忽略,除非必须分开两个相邻字段。
- Year: 如果格式器的
Calendar
是格里高利历,则应用以下规则。
- 对于格式化来说,如果模式字母的数量为 2,则年份截取为 2 位数,否则将年份解释为 number。
- 对于解析来说,如果模式字母的数量大于 2,则年份照字面意义进行解释,而不管数位是多少。因此使用模式 "MM/dd/yyyy",将 "01/11/12" 解析为公元 12 年 1 月 11 日。
- 在解析缩写年份模式("y" 或 "yy")时,
SimpleDateFormat
必须相对于某个世纪来解释缩写的年份。这通过将日期调整为SimpleDateFormat
实例创建之前的 80 年和之后 20 年范围内来完成。例如,在 "MM/dd/yy" 模式下,如果SimpleDateFormat
实例是在 1997 年 1 月 1 日创建的,则字符串 "01/11/12" 将被解释为 2012 年 1 月 11 日,而字符串 "05/04/64" 将被解释为 1964 年 5 月 4 日。在解析时,只有恰好由两位数字组成的字符串(如Character.isDigit(char)
所定义的)被解析为默认的世纪。其他任何数字字符串将照字面意义进行解释,例如单数字字符串,3 个或更多数字组成的字符串,或者不都是数字的两位数字字符串(例如"-1")。因此,在相同的模式下, "01/02/3" 或 "01/02/003" 解释为公元 3 年 1 月 2 日。同样,"01/02/-3" 解析为公元前 4 年 1 月 2 日。
- Month: 如果模式字母的数量为 3 或大于 3,则将月份解释为 text;否则解释为 number。
- General time zone: 如果时区有名称,则将它们解释为 text。对于表示 GMT 偏移值的时区,使用以下语法:
GMTOffsetTimeZone:
Hours 必须在 0 到 23 之间,Minutes 必须在 00 到 59 之间。格式是与语言环境无关的,并且数字必须取自 Unicode 标准的 Basic Latin 块。GMT
Sign Hours:
Minutes Sign: one of+ -
Hours: Digit Digit Digit Minutes: Digit Digit Digit: one of0 1 2 3 4 5 6 7 8 9
对于解析来说,RFC 822 time zones 也是可接受的。
- RFC 822 time zone: 对于格式化来说,使用 RFC 822 4-digit 时区格式:
RFC822TimeZone: Sign TwoDigitHours Minutes TwoDigitHours: Digit Digit
TwoDigitHours 必须在 00 和 23 之间。其他定义请参阅 general time zones。对于解析来说,general time zones 也是可接受的。
SimpleDateFormat
还支持
本地化日期和时间模式 字符串。在这些字符串中,以上所述的模式字母可以用其他与语言环境有关的模式字母来替换。
SimpleDateFormat
不处理除模式字母之外的文本本地化;而由类的客户端来处理。
示例
以下示例显示了如何在美国语言环境中解释日期和时间模式。给定的日期和时间为美国太平洋时区的本地时间 2001-07-04 12:08:56。
日期和时间模式 结果 "yyyy.MM.dd G 'at' HH:mm:ss z"
2001.07.04 AD at 12:08:56 PDT
"EEE, MMM d, ''yy"
Wed, Jul 4, '01
"h:mm a"
12:08 PM
"hh 'o''clock' a, zzzz"
12 o'clock PM, Pacific Daylight Time
"K:mm a, z"
0:08 PM, PDT
"yyyyy.MMMMM.dd GGG hh:mm aaa"
02001.July.04 AD 12:08 PM
"EEE, d MMM yyyy HH:mm:ss Z"
Wed, 4 Jul 2001 12:08:56 -0700
"yyMMddHHmmssZ"
010704120856-0700
"yyyy-MM-dd'T'HH:mm:ss.SSSZ"
2001-07-04T12:08:56.235-0700
同步
日期格式是不同步的。建议为每个线程创建独立的格式实例。如果多个线程同时访问一个格式,则它必须是外部同步的。
-
另请参见:
-
Java Tutorial,
Calendar
,TimeZone
,DateFormat
,DateFormatSymbols
, 序列化表格
嵌套类摘要 |
---|
从类 java.text.DateFormat 继承的嵌套类/接口 |
---|
DateFormat.Field |
字段摘要 |
---|
构造方法摘要 | |
---|---|
SimpleDateFormat() 用默认的模式和默认语言环境的日期格式符号构造 SimpleDateFormat 。 | |
SimpleDateFormat(String pattern) 用给定的模式和默认语言环境的日期格式符号构造 SimpleDateFormat 。 | |
SimpleDateFormat(String pattern, DateFormatSymbols formatSymbols) 用给定的模式和日期符号构造 SimpleDateFormat 。 | |
SimpleDateFormat(String pattern, Locale locale) 用给定的模式和给定语言环境的默认日期格式符号构造 SimpleDateFormat 。 |
方法摘要 | |
---|---|
void | applyLocalizedPattern(String pattern) 将给定的本地化模式字符串应用于此日期格式。 |
void | applyPattern(String pattern) 将给定模式字符串应用于此日期格式。 |
Object | clone() 创建此 SimpleDateFormat 的一个副本。 |
boolean | equals(Object obj) 比较给定对象与此 SimpleDateFormat 的相等性。 |
StringBuffer | format(Date date, StringBuffer toAppendTo, FieldPosition pos) 将给定的 Date 格式化为日期/时间字符串,并将结果添加到给定的 StringBuffer 。 |
AttributedCharacterIterator | formatToCharacterIterator(Object obj) 格式化生成 AttributedCharacterIterator 的对象。 |
Date | get2DigitYearStart() 返回在 100 年周期内被解释的两位数字年份的开始日期。 |
DateFormatSymbols | getDateFormatSymbols() 获取此日期格式的日期和时间格式符号的一个副本。 |
int | hashCode() 返回此 SimpleDateFormat 对象的哈希码值。 |
Date | parse(String text, ParsePosition pos) 解析字符串的文本,生成 Date 。 |
void | set2DigitYearStart(Date startDate) 设置 100 年周期的两位数年份,该年份将被解释为从用户指定的日期开始。 |
void | setDateFormatSymbols(DateFormatSymbols newFormatSymbols) 设置此日期格式的日期和时间格式符号。 |
String | toLocalizedPattern() 返回描述此日期格式的本地化模式字符串。 |
String | toPattern() 返回描述此日期格式的模式字符串。 |