不灭的焱

革命尚未成功,同志仍须努力下载JDK17

作者:Albert.Wen  添加时间:2023-04-06 21:59:29  修改时间:2024-04-20 17:57:17  分类:Java基础  编辑

Java中使用SimpleDateFormat类的构造函数SimpleDateFormat(String str)构造格式化日期的格式,通过format(Date date)方法将指定的日期(Date)对象格式化为指定格式的字符串。

SimpleDateFormat构造函数中字符串的格式,以及各部分代表的含义:

import java.text.SimpleDateFormat;
import java.util.Date;

public class test{

    public static void main(String args[]) {
        Date newTime = new Date();
        //设置时间格式
        SimpleDateFormat sdf1 = new SimpleDateFormat("y-M-d h:m:s a E");
        SimpleDateFormat sdf2 = new SimpleDateFormat("yy-MM-dd hh:mm:ss a E");
        SimpleDateFormat sdf3 = new SimpleDateFormat("yyyy-MMM-ddd hhh:mmm:sss a E");
        SimpleDateFormat sdf4 = new SimpleDateFormat("yyyyy-MMMM-dddd hhhh:mmmm:ssss a E");
        
        //获取的时间,是本机的时间
        String formatDate1 = sdf1.format(newTime);
        String formatDate2 = sdf2.format(newTime);
        String formatDate3 = sdf3.format(newTime);
        String formatDate4 = sdf4.format(newTime);

        System.out.println(formatDate1);  
        System.out.println(formatDate2); 
        System.out.println(formatDate3); 
        System.out.println(formatDate4); 
    }
}

运行结果:

一、字符串"yyyy-MM-dd hh:mm:ss",其中:

yyyy:代表(不去区分大小写)假设年份为 2017

  1. "y" , "yyy" , "yyyy" 匹配的都是4位完整的年 如:"2017"
  2. "yy" 匹配的是年分的后两位 如:"15"
  3. 超过4位,会在年份前面加"0"补位,如 "YYYYY"对应"02017"

MM:代表(只能使用大写)假设月份为 9

  1. "M" 对应 "9"(1-2位显示)
  2. "MM" 对应 "09"(2位数表示)
  3. "MMM" 对应 "Sep"(显示为英文月份简写)
  4. "MMMM" 对应 "September"(显示为英文月份全称)
  5. 超出3位,仍然对应 "September"

dd:代表(只能使用小写)假设为03号

  1.  "d" 对应 "3"(1-2位显示)
  2. "dd" 对应 "03"(2位数表示)
  3. 超出2位,会在数字前面加"0"补位,例如 "dddd" 对应 "0013"

hh:代表(区分大小写,大写为24进制计时,小写为12进制计时)假设为05时

  1. "H" 对应 "5"
  2. "HH" 对应 "05" ,超出2位,会在数字前面加"0"补位,例如 "HHHH" 对应 "0005"
  3. "h" 对应 "3"
  4. "hh" 对应 "03",超出2位,会在数字前面加"0"补位,例如 "hhhh" 对应 "0003"

mm:代表(只能使用小写)假设为02分

  1. "m" 对应 "2"(1-2位显示)
  2. "mm" 对应 "02"(2位数表示)
  3. 超出2位,会在数字前面加"0"补位。例如 "mmmm" 对应 "0032"

ss : 代表(只能使用小写)假设为05秒

  1.  "s" 对应 "5"(1-2位显示)
  2.  "ss" 对应 "15"(2位数表示)
  3. 超出2位,会在数字前面加"0"补位,例如 "ssss" 对应 "0015"

E : 代表星期(只能使用大写)假设为 Sunday

  1. "E" , "EE" , "EEE" 都对应 "Sun"(简写星期几)
  2. "EEEE" 对应 "Sunday",超出4位,仍然对应 "Sunday"(全写星期几)

a : 代表上午还是下午,如果是上午就对应 "AM" ,如果是下午就对应 "PM"

 

其中的分隔符"-"可以替换成其他非字母的任意字符(也可以是汉字),例如:

部分修改:

运行结果:

二、日期和时间的格式化编码

时间模式字符串用来指定时间格式。在此模式中,所有的 ASCII 字母被保留为模式字母,定义如下:

字母 描述 示例
G 纪元标记 AD
y 四位年份 2001
M 月份 July or 07
d 一个月的日期 10
h  A.M./P.M. (1~12)格式小时 12
H 一天中的小时 (0~23) 22
m 分钟数 30
s 秒数 55
S 毫秒数 234
E 星期几 Tuesday
D 一年中的日子 360
F 一个月中第几周的周几 2 (second Wed. in July)
w 一年中第几周 40
W 一个月中第几周 1
a A.M./P.M. 标记 PM
k 一天中的小时(1~24) 24
K  A.M./P.M. (0~11)格式小时 10
z 时区 Eastern Standard Time
' 文字定界符 Delimiter
" 单引号 `

三、解析英文格式的月份日期

英文格式的时间转换时需要带上Locale.ENGLISH,否则会转换失败,因为它默认的是本地化的设置,除非你的操作系统是英文的,总之时间转换时需要时间格式与模式保持一致。

// 由于要解析的日期中有Mar这样的英文,所以用下面这个格式
//(需要指定第二个参数值为:Locale.ENGLISH)
SimpleDateFormat simpleDateFormat = new SimpleDateFormat("dd/MMM/yyyy:HH:mm:ss", Locale.ENGLISH);
Date date = simpleDateFormat.parse("06/Mar/2017:00:43:07");

// 由于Date中的很多方法已经不建议使用,所以变成GregorianCalendar
GregorianCalendar calendar=new GregorianCalendar();
calendar.setTime(date);
System.out.println(calendar.get(Calendar.MONTH));

​​​

 

参考:

  1. SimpleDateFormat日期格式(浅面)
  2. [菜鸟教程] Java 日期时间
  3. SimpleDateFormat日期格式
  4. SimpleDateFormat 使用方法和中英文时间格式化转换