达梦数据库日期格式化_Java时间转换,日期格式化使用 YYYY-MM-dd 的潜在问题

本文揭示了Java中使用'YYYY-MM-dd'进行日期格式化时可能遇到的问题。当日期涉及跨年且周日作为一周开始时,'YYYY'会根据周归属将日期归入下一年。例如,2020年12月27日会被错误地格式化为2021年。解决方案是使用'yyyy-MM-dd'确保正确表示年份。

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

Java时间转换,日期格式化使用 YYYY-MM-dd 的潜在问题

日期格式化使用 YYYY-MM-dd 的潜在问题测试逻辑:创建两个日期格式化,一个是出问题的YYYY-MM-dd,另一个是正确用法yyyy-MM-dd

分别去格式化两个不同的日期:2020年12月26日(周六),2020年12月27日(周日)代码如下@Test

public void dateTest() {

// 指定了两个时区

// 通过指定具体的 年月日时分秒 构建 一个 LocalDateTime 对象(无时区), 绑定 到 北京时区,转为 实例,构建Date 对象

test(Date.from(LocalDateTime.of(2020,12,27,12,1,35).atZone(ZoneId.of("Asia/Shanghai")).toInstant()));

test(Date.from(LocalDateTime.of(2020,12,26,12,1,35).atZone(ZoneId.of("Asia/Shanghai")).toInstant()));

}

private void test(Date date) {

String loY = "yyyy-MM-dd HH:mm:ss";

String upY = "YYYY-MM-dd HH:mm:ss";

SimpleDateFormat loF = new SimpleDateFormat(loY);

SimpleDateFormat upF = new SimpleDateFormat(upY);

System.out.println("小Y格式化:" + loF.format(date));

System.out.println("大Y格式化:" + upF.format(date));

System.out.println("===========================");

}代码运行结果小Y格式化:2020-12-27 12:01:35

大Y格式化:2021-12-27 12:01:35

===========================

小Y格式化:2020-12-26 12:01:35

大Y格式化:2020-12-26 12:01:35

===========================结果分析

发现当日期为 2020-12-27 时,两个 SimpleDateFormat 对象的转换的出来年份不一样,原因时一个的样式使用的 年份的 标识不同 "YYYY" 和 "yyyy"

具体原因时,"Y"是表示周年,表示:当天所在的周属于的年份,一周从周日开始,周六结束,只要本周跨年,那么这周就算入下一年

对于周年的具体解释:参考:GregorianCalendar#getWeekYear() 这个方法上的注释

返回此公历所代表的周年。从“1”到“最大周数”之间的周中的日期具有相同的“周年”值,可以是“年(日历年)”值的前一年,也可以是“年(日历年)”值的后一年。

此方法在计算周年之前调用

就是说对于年份的区分,是把一年的天数,分成多少周(能整除的天数,就算这个周年表示的年份和当前的公历年份相同),后面多余不满一周当年的多余天数的就表示是下一个周年(就是当前公历年份的下一年)

SimpleDateFormat 类上的注释中的一些说明LetterDate or Time ComponentPresentationExamples

GEra designatorAD

yYear1996; 96

YWeek year2009; 09

MMonth in year (context sensitive)July; Jul; 07

LMonth in year (standalone form)July; Jul; 07

wWeek in year27

WWeek in month2

DDay in year189

dDay in month10

FDay of week in month2

EDay name in weekTuesday; Tue

uDay number of week (1 = Monday, ..., 7 = Sunday)1

aAm/pm markerPM

HHour in day (0-23)0

kHour in day (1-24)24

KHour in am/pm (0-11)0

hHour in am/pm (1-12)12

mMinute in hour30

sSecond in minute55

SMillisecond978

zTime zonePacific Standard Time; PST; GMT-08:00

XTime zone-08; -0800;  -08:00

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值