Java SimpleDateFormat类
java.text.SimpleDateFormat是DateFormat类的具体实现,用于按照传递的格式设置格式对日期进行格式化和解析。例如
SimpleDateFormat sdf = new SimpleDateFormat("EEEE, MMMM dd, yyyy");
以2019年7月15日星期三的格式显示格式化日期
Java SimpleDateFormat构造函数
SimpleDateFormat类中有四个构造函数。
- SimpleDateFormat()使用默认FORMAT语言环境的默认模式和日期格式符号构造一个SimpleDateFormat。 
- SimpleDateFormat(String pattern)使用给定的模式和默认的FORMAT语言环境的默认日期格式符号构造一个SimpleDateFormat。 
- SimpleDateFormat(String pattern,DateFormatSymbols formatSymbols)使用给定的模式和日期格式符号构造一个SimpleDateFormat。 
- SimpleDateFormat(String pattern,Locale locale)使用给定的模式和给定语言环境的默认日期格式符号构造一个SimpleDateFormat。 
Java SimpleDateFormat日期和时间模式
日期和时间格式由日期和时间模式字符串指定。以下列表显示了与SimpleDateFormat一起使用的模式字母。
| 字母 | 日期或者时间组成部分 | 演示文稿 | 示例 | 
|---|---|---|---|
| G | 世纪代号 | 文本 | AD | 
| y | 年 | 年 | 1996; 96 | 
| Y | 周 | 年 | 2009; 09 | 
| M | 一年中的月份(上下文敏感) | 月 | 七月;七月07 | 
| L | 一年中的月(独立形式) | 月 | 七月;七月07 | 
| w | 一年中的一周 | 数字 | 27 | 
| W | 一周中的一周 | 数字 | 2 | 
| D | 一年中的天 | 数字 | 189 | 
| d | 每月的天数 | 数字 | 10 | 
| F | 每月的星期几 | 数字 | 2 | 
| E | 星期几 | 文本 | 星期二;星期二 | 
| u | 星期几(1 =星期一,…,7 =星期日) | 数字 | 1 | 
| a | Am / pm标记 | 文本 | PM | 
| H | 小时(0-23) | 数字 | 0 | 
| k | 小时(1-24) | 数字 | 24 | 
| K | 小时/下午(0-11) | 小时数 | 0 | 
| h | 小时上午/下午(1-12) | 数字 | 12 | 
| m | 分钟(小时) | 数字 | 30 | 
| s | 秒(秒) | 数字 | 55 | 
| S | 毫秒 | 数字 | 978 | 
| z | 时区 | 常规时区 | 太平洋标准时间;太平洋标准时间; GMT-08:00 | 
| Z | 时区 | RFC 822时区 | -0800 | 
| X | 时区 | ISO 8601时区 | -08; -0800; -08:00 | 
模式遵循的规则如下
1.对于文本,如果图案字母的数量为4个或者更多,则使用完整形式,否则使用简短形式或者缩写形式(如果可用)。例如,EEEE模式可以显示星期三的全名,例如星期三,而EEE模式可以显示星期三。
2.对于格式化,图案字母的数量是最小位数,较短的数字用零填充此数量。
对于数字,重复图案字母的次数确定最小位数,对于较短的数字,如果需要,则进行零填充。例如,hh:mm:ss显示03:45:15,但是h:m:s显示与3:45:15相同的时间。
3.对于月份,如果图案字母的数量为3个或者更多,则月份被解释为文本;否则,将其解释为数字。
使用SimpleDateFormat示例格式化日期
创建具有指定模式的SimpleDateFormat实例后,使用format()方法可以格式化日期。
import java.text.SimpleDateFormat;
import java.util.Date;
public class FormatDate {
  public static void main(String[] args) {
    // For date in format 2019.07.04 AD at 11:08:54 IST
    formatDate("yyyy.MM.dd G 'at' HH:mm:ss z");
    // For date in format Mon, Oct 7, '19
    formatDate("EEE, MMM d, ''yy");
    // For date in format Monday, October 07, 2019
    formatDate("EEEE, MMMM dd, yyyy");
    // For time in format 07 o'clock PM, India Standard Time
    formatDate("hh 'o''clock' a, zzzz");
    // For time in 24 Hr format 19:41:59:635 PM
    formatDate("HH:mm:ss:SSS a");
    // For date-time in format 2019-10-07T19:27:38.571+0530
    formatDate("yyyy-MM-dd'T'HH:mm:ss.SSSZ");
    // For date in format 05/08/2016
    formatDate("MM/dd/yyyy");
    // For date in format 07/10/2019 19:29:40 PM
    formatDate("dd/MM/yyyy HH:mm:ss a");
    // For date in format 07/10/2019 19:29:40 PM
    formatDate("dd/MMM/yyyy GGG HH:mm:ss:SSS a");
  }
	
  private static void formatDate(String pattern){
    Date dt = new Date();
    // Create date format as per specified pattern
    SimpleDateFormat sdf = new SimpleDateFormat(pattern);
    String formattedDate = sdf.format(dt);
    System.out.println("Formatted Date- " + formattedDate +
              " for Pattern: " + pattern); 
  }
}
输出:
Formatted Date- 2019.10.07 AD at 19:41:59 IST for Pattern: yyyy.MM.dd G 'at' HH:mm:ss z Formatted Date- Mon, Oct 7, '19 for Pattern: EEE, MMM d, ''yy Formatted Date- Monday, October 07, 2019 for Pattern: EEEE, MMMM dd, yyyy Formatted Date- 07 o'clock PM, India Standard Time for Pattern: hh 'o''clock' a, zzzz Formatted Date- 19:41:59:635 PM for Pattern: HH:mm:ss:SSS a Formatted Date- 2019-10-07T19:41:59.638+0530 for Pattern: yyyy-MM-dd'T'HH:mm:ss.SSSZ Formatted Date- 10/07/2019 for Pattern: MM/dd/yyyy Formatted Date- 07/10/2019 19:41:59 PM for Pattern: dd/MM/yyyy HH:mm:ss a Formatted Date- 07/Oct/2019 AD 19:41:59:641 PM for Pattern: dd/MMM/yyyy GGG HH:mm:ss:SSS a
使用SimpleDateFormat解析日期
使用SimpleDateFormat的parse()方法,可以将String转换为java.util.Date实例。
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
public class ParseDate {
  public static void main(String[] args) {
    try {
      parse("dd/MM/yyyy", "09/08/2019");
      
      parse("MM-dd-yyyy", "09-08-2019");
      // Date will default to epoch (January 1, 1970)
      parse("HH:mm:ss", "20:04:19");
      
      parse("MM-dd-yyyy HH:mm:ss", "09-08-2019 20:04:19");
    }catch (ParseException e) {
      System.out.println("Error while parsing- " + e.getMessage());
    }
  }
	
  private static void parse(String pattern, String dateTime) throws ParseException{
    // Create date format as per specified pattern
    SimpleDateFormat sdf = new SimpleDateFormat(pattern);
    Date dt = sdf.parse(dateTime);
    System.out.println("After parsing- " + dt);
  }
}
输出:
After parsing- Fri Aug 09 00:00:00 IST 2019 After parsing- Sun Sep 08 00:00:00 IST 2019 After parsing- Thu Jan 01 20:04:19 IST 1970 After parsing- Sun Sep 08 20:04:19 IST 2019

