关于时间格式的大小写

本文探讨了在Java中使用SimpleDateFormat进行日期格式化时,'YYYY'与'yyyy'的区别。'YYYY'根据周计算年份,可能导致意外结果,而'yyyy'则按常规理解的年份进行格式化。正确使用'yyyy-MM-dd'可以避免混淆。同时,文章还解释了日期时间格式中MM, HH, dd等大小写的含义。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

YYYY-MM-dd 与 yyyy-MM-dd

Calendar calendar = Calendar.getInstance();
calendar.set(2019, Calendar.DECEMBER, 31);

Date testDate = calendar.getTime();

SimpleDateFormat dtf = new SimpleDateFormat("YYYY-MM-dd");
System.out.println("2019-12-31 转 YYYY-MM-dd 格式后 " + dtf.format(testDate));

输出结果:

2019-12-31 转 YYYY-MM-dd 格式后 2020-12-31

解析

为什么不是 2019-12-31 而是 2020-12-31?这是因为 ‘YYYY’ 是按照基于周来计算的年的,它指向当天所在周属于的年份,一周从周日开始算起,周六结束,只要本周跨年,那这一周就算下一年的了。正确姿势是使用 ‘yyyy’ 格式。

来看看正确姿势

Calendar calendar = Calendar.getInstance();
calendar.set(2019, Calendar.DECEMBER, 31);

Date testDate = calendar.getTime();

SimpleDateFormat dtf = new SimpleDateFormat("yyyy-MM-dd");
System.out.println("2019-12-31 转 yyyy-MM-dd 格式后 " + dtf.format(testDate));

输出结果:

2019-12-31 转 yyyy-MM-dd 格式后 2019-12-31

yyyy-MM-dd 中的MM为什么是大写?

yyyy-mm-dd 是标识 “年-月-日”,那 yyyy-MM-dd 是为了区分 HH:mm:ss 中的mm(分)
那 HH:mm:ss 中的 HH 为什么大写? 是为了区分 12小时制与24小时制
h 代表 12小时制,H 代表24小时制。

yyyy-M-d H : m : s

有时候会看到这样的格式,它们的区别是是否有前导零,H,m,s表示非零开始,HH,mm,ss表示从零开始。比如:凌晨1点2分,HH:mm:ss 表示 01:02,H:m 表示 1:2

yyyyy/yyy/yy/y

yyyyy/yyy/yy/y 显示为:2020/2020/20/0 ,yyy 与 yyyy 表示的是一样的,只是为了便于理解一般都写成 yyyy,yy 表示 年份后两位,y 表示年份最后一位。

MMMM/MMM/MM/M

MMMM/MMM/MM/M 显示为:一月/一月/01/1 ,其中 MMMM 显示全程,MMM 显示缩写,但中文都是一样的,英文是 January/Jan

dddd/ddd/dd/d

dddd/ddd/dd/d 显示为:星期三/周三(有的语言显示“三”)/01/1,其中 dddd 显示全程,ddd 是简称,dd/d 表示的是几号。

HH/H/hh/h

HH/H/hh/h 显示为:01/1/01 AM/1 AM

### Oracle 数据库中的日期格式大写和小写表示方法 在 Oracle 数据库中,日期格式可以通过 `TO_CHAR` 和 `TO_DATE` 函数来指定。这些函数允许使用不同的格式模型来解析或显示日期时间值。对于大小写的处理,主要体现在月份名称、星期几以及 AM/PM 的表示上。 #### 小写字母表示法 当希望以小写字母形式展示月份或星期几时,在格式字符串前加上 FXFMODIFIER 并设置为 'fm' 可去除多余的空白并转换成小写: ```sql SELECT TO_CHAR(SYSDATE, 'fmMonth fmDay', 'NLS_DATE_LANGUAGE=AMERICAN') AS lowercase_month_day FROM DUAL; ``` 此查询会返回类似 "september 18" 这样的结果[^2]。 #### 大写字母表示法 默认情况下,如果不特别指明,则月份名和星期几将以首字母大写的形式呈现。如果想要全部大写,可以利用 SQL\*Plus 或其他客户端工具提供的列格式化功能,或者通过 PL/SQL 中的 `UPPER()` 函数实现: ```sql SELECT UPPER(TO_CHAR(SYSDATE, 'MONTH DD')) AS uppercase_month_day FROM DUAL; ``` 这段代码将会把月份名字完全转为大写输出,例如 "SEPTEMBER 18"。 #### 时间部分 (AM/PM) 对于一天中的时间段标记(即上午下午),也可以控制其大小写: - 使用 `'am'` 或者 `'pm'` 来获取小写的 am/pm; - 使用 `'a.m.'` 或者 `'p.m.'` 获取带有句号的小写版本; - 默认情况下的 `'AM'` / `'PM'` 是全大写的。 示例: ```sql SELECT TO_CHAR(SYSDATE, 'HH12:MI PM') AS time_with_uppercase_pm, TO_CHAR(SYSDATE, 'hh12:mi pm') AS time_with_lowercase_pm FROM DUAL; ``` 上述语句分别展示了如何获得不同样式的上下午指示符。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值