跨年的你,有没有被“YYYY-MM-dd”叫回去加班呀

YYYY-MM-dd 与 yyyy-MM-dd 的区别以及跨年问题 大写的YYYY通常用于表示“周年”,在某些编程语言或者数据格式中,比如ISO 8601日期格式中,YYYY可能代表的是所在周属于的年份。这意味着,如果一周跨越了两个不同的年份,该周会被归属到哪一年取决于这周中的大部分日子属于哪一年。 阅读详情

危机四伏的2020已经悄然而过

不知大家是否还记得

年初的微博上长久挂着#重启2020#的热搜

在最艰难的日子里

普通人要少看手机少看新闻

才能缓解内心的压抑和惶恐

这一年,一些人没有扛过去

但更多人,终究走下来了

此时此刻我们已经跨年结束

来到了全新的2021年……

感慨不说了

咳咳,想知道跨年可还安稳?

"YYYY-MM-dd"有没有给你送来新年的彩蛋?

事故模拟

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-fJ6pieKA-1609596215025)(http://qiniu.hughpro.com/20210102205020.png)]

看到上面程序运行的结果,大家肯定会有疑惑,为毛不一样呀(内心小声嘀咕:“不应该啊,之前没出现过问题的”)

事故分析

既然有疑惑,那我们就翻翻Java Api找找看,随便找个在线文档,找到SimpleDateFormat里面就有关于日期格式的说明,我帮大家找好了:Java Api在线链接

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-YZS7QXt7-1609596215029)(http://qiniu.hughpro.com/20210102210732.png)]

在Api里面y 的释义是year,很好理解就是年的意思,那Y的释义是Week year ,代表的是本周所在年份,而只要本周跨年,那么本周都是算到下一年的,所以就出现了上面的事故现场。

在外国一周是从周日开始到周六结束,其实这个问题在2020年12月27日就已经发生了,上面的测试代码,改成27,一样是会变成2021年12月27日。

在项目中,应该尽量避免每次转换日期都手动进行编写格式的操作,这边总会不可避免的产生这样的问题,统一定义一个DateUtil类,里面提供各种转换格式的方法以及所以常用的到的格式的常量定义,这样跨年的彩蛋就会更换啦,哈哈

public class DateUtil{
    /**
     * 日期格式,年份,例如:2004,2008
     */
    public static final String DATE_FORMAT_YYYY = "yyyy";
    /**
     * 日期格式,年份和月份,例如:200707,200808
     */
    public static final String DATE_FORMAT_YYYYMM = "yyyyMM";
    /**
     * 日期格式,年份和月份,例如:200707,2008-08
     */
    public static final String DATE_FORMAT_YYYY_MM = "yyyy-MM";
    /**
     * 日期格式,年月日,例如:050630,080808
     */
    public static final String DATE_FORMAT_YYMMDD = "yyMMdd";
    /**
     * 日期格式,年月日,用横杠分开,例如:06-12-25,08-08-08
     */
    public static final String DATE_FORMAT_YY_MM_DD = "yy-MM-dd";
    /**
     * 日期格式,年月日,例如:20050630,20080808
     */
    public static final String DATE_FORMAT_YYYYMMDD = "yyyyMMdd";
    /**
     * 日期格式,年月日,用横杠分开,例如:2006-12-25,2008-08-08
     */
    public static final String DATE_FORMAT_YYYY_MM_DD = "yyyy-MM-dd";
    /**
     * 日期格式,年月日,例如:2016.10.05
     */
    public static final String DATE_FORMAT_POINTYYYYMMDD = "yyyy.MM.dd";
    /**
     * 日期格式,年月日,例如:2016年10月05日
     */
    public static final String DATE_TIME_FORMAT_YYYY年MM月DD日 = "yyyy年MM月dd日";
    /**
     * 日期格式,年月日时分,例如:200506301210,200808081210
     */
    public static final String DATE_FORMAT_YYYYMMDDHHmm = "yyyyMMddHHmm";
    /**
     * 日期格式,年月日时分,例如:20001230 12:00,20080808 20:08
     */
    public static final String DATE_TIME_FORMAT_YYYYMMDD_HH_MI = "yyyyMMdd HH:mm";
    /**
     * 日期格式,年月日时分,例如:2000-12-30 12:00,2008-08-08 20:08
     */
    public static final String DATE_TIME_FORMAT_YYYY_MM_DD_HH_MI = "yyyy-MM-dd HH:mm";
    /**
     * 日期格式,年月日时分秒,例如:20001230120000,20080808200808
     */
    public static final String DATE_TIME_FORMAT_YYYYMMDDHHMISS = "yyyyMMddHHmmss";
    /**
     * 日期格式,年月日时分秒,年月日用横杠分开,时分秒用冒号分开
     * 例如:2005-05-10 23:20:00,2008-08-08 20:08:08
     */
    public static final String DATE_TIME_FORMAT_YYYY_MM_DD_HH_MI_SS = "yyyy-MM-dd HH:mm:ss";
    /**
     * 日期格式,年月日时分秒毫秒,例如:20001230120000123,20080808200808456
     */
    public static final String DATE_TIME_FORMAT_YYYYMMDDHHMISSSSS = "yyyyMMddHHmmssSSS";
    /**
     * 日期格式,月日时分,例如:10-05 12:00
     */
    public static final String DATE_FORMAT_MMDDHHMI = "MM-dd HH:mm";
}

补充

另外,SimpleDateFormat是线程不安全的,不推荐使用了,当并发较高的时候,容易出现问题,那如何解决呢?

  1. 使用局部变量的方式

    public class DateUtil{
        public static  String formatDate(Date date)throws ParseException {
            SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
            return sdf.format(date);
        }
     
        public static Date parse(String strDate) throws ParseException {
            SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
            return sdf.parse(strDate);
        }
    }
    

    在需要用到SimpleDateFormat 的地方新建一个实例,不管什么时候,将有线程安全问题的对象由共享变为局部私有都能避免多线程问题,不过也加重了创建对象的负担。在一般情况下,这样其实对性能影响并不是很明显的。

  2. 加同步锁

    public class DateUtil {
        private static final SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        public static  String formatDate(Date date)throws ParseException {
            synchronized (sdf){
                return sdf.format(date);
            }
        }
        public static Date parse(String strDate) throws ParseException{
            synchronized (sdf){
                return sdf.parse(strDate);
            }
        }
    }
    

    这样,当一个线程正在调用的时候,其他想要调用此方法的线程就要block,多线程并发量大的时候会对性能有一定的影响。

  3. 使用ThreadLocal

    public class DateUtil {
        private static ThreadLocal<DateFormat> sdfThreadLocal =  new ThreadLocal<DateFormat>(){
                @Override
                public SimpleDateFormat initialValue(){
                   return  new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
                }
        };
        public static  String formatDate(Date date)throws ParseException {
            return sdfThreadLocal.get().format(date);
        }
        public static Date parse(String strDate) throws ParseException{
            return sdfThreadLocal.get().parse(strDate);
        }
    }
    

    使用ThreadLocal, 也是将共享变量变为独享,线程独享肯定能比方法独享在并发环境中能减少不少创建对象的开销。

  4. 使用DateTimeFormatter

    DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm");
    //字符串转日期
    LocalDate localDate = LocalDate.parse("2021-01-01 21:50:50",formatter);
    //日期转字符串
    LocalTime localTime = LocalTime.now();
    String strLocalTime = localTime.format(formatter);
    //yyyyMMdd
    String strLocalTime1 = localTime.format(DateTimeFormatter.BASIC_ISO_DATE); 
    

    上面代码仅仅是示例,关于DateTimeFormatter还有好多便捷的用法,它本身提供了一些自带的格式,不需再自己编写。和SimpleDateFormat不同的是,DateTimeFormatter不但是不变对象,它还是线程安全的,使用的时候,DateTimeFormatter可以只创建一个实例,到处引用。

预祝大家2021年一切顺顺利利,疫情早点结束!

有任何问题欢迎关注公众号私信我,一起探讨,一起学习
在这里插入图片描述

Java YYYY/MM/dd遇到跨年日期的问题 前言 2020年12月26号和27号这两天,即将迎来21考研,如果我们用YYYY/MM/dd来格式化这两个日期,那考研可真是”度日如年“啊!考之前还是20年,考了个研都变成了21年。 YYYY与yyyy 这是怎么回事呢?我们用SimpleDateFormat格式化日期的时候,有YYYY/MM/dd和yyyy/MM/dd这两种格式,而YYYY和yyyy是有区别的,在官方文档中对YYYY的解释是 week-based-year,表示当天所在周属于的年份,每周以周日开始,周六结束,而每周的年份是怎么确定的呢?是以 阅读详情

相关推荐

周立功CAN盒二次开发实录:用QT5.1.0解析汽车CAN报文(附数据可视化技巧)

本文详细介绍了基于QT5.1.0和周立功USBCAN-E-U设备进行汽车CAN总线二次开发的实战过程。核心内容包括利用CANdb++数据库解析原始报文并转换为物理值,以及通过QCustomPlot库实现高性能实时数据可视化,为车载诊断与车联网开发提供了一套完整的工程实践方案。

sugar的博客 1058

SQL函数 - DATE_DIFF()

sql计算时间差

Lizzy_Fly的博客 1万+

高通Sensor Tuning实战:手把手教你用Chromatix生成并打包bin文件(附避坑指南)

本文详细介绍了高通Sensor Tuning的全流程实战,从Chromatix配置到Bin文件加载验证。通过手把手教程,帮助开发者掌握Chromatix工具链的使用,避免常见配置错误,提升调试效率。特别针对kalama等新一代平台,提供经过验证的解决方案和避坑指南。

ios99的博客 483

SQL日期函数

一、知识点 在SQL中,由于不能直接执行算术函数,所以日期函数在SQL就十分有用。 日期函数拥有多个方法,每个方法都可以对日期进行查改或计算。 比如: GETDATE()方法,获取当前的系统日期。 DATEADD(日期部分,number,date)返回带有指定数字(number)的日期(date),该数字添加到指定的日期部分(datepart)。 DATEDIFF(日期部分,date1,date2)返回两个日期中指定的日期部分之间的差值。 DATENAME(日期部分,date)返回日期中日期部分的字符串形

kids_fan的博客 1万+

一个Android应用层开发如何转型深入Android Framework?

不知何时起,单纯的Android应用层开发越来越少了,主流技术演变也越来越快,从之前的rxjava到如今的协程,从之前MVC到如今的MVVM,还有Flutter、Compose等技术,可以说是日新月异。

m0_64420071的博客 1911

微波射频学习笔记18-------偶极子天线和微波天线设计介绍

几种天线设计方法的介绍 一、偶极子天线 1.天线模型 两根紧挨着的金属导体,长度均为四分之一波长,直径均远小于波长,两导体间距也远小于波长。 2.天线性能的设计因素 ① 单个导体长度L:(光速/频率)/4=四分之一波长(在空气中传播的波长),但在导体中传播,波长会变短; ② 导体半径R:远小于波长即可,使用导电率高些的材料,市面上常见直径零点几毫米就挺好,或者用波长/200,得出一个小200的值,也算远小于波长; ③ 两导体间距S:远小于波长即可,可以比半径更小点。 以上三个变量L、R、S,均可在仿真软件

Sil_sprout 1万+

MySQL中的DATEFDIFF函数

MySQL中的DATEFDIFF函数 获取两个日期的时间间隔为1天:datediff(w1.recordDate,w2.recordDate)=1 select w1.id from Weather w1,Weather w2 where datediff(w1.recordDate,w2.recordDate)=1 and w1.Temperature > w2.Temperature;

weixin_44028181的博客 3355

从SRIOV到SIOV:PCIe虚拟化技术下一代革命

如果说SR-IOV是过去十年PCIe虚拟化的“标杆方案”,那SIOV就是为超大规模云数据中心、AI集群量身打造的“破局者”——它解决了SR-IOV难以逾越的扩展性瓶颈,同时平衡了性能、成本与生态兼容性。今天就从“为什么需要SIOV”到“SIOV到底强在哪”,再到“未来要解决什么问题”,做一次全方位深度拆解。

存储随笔 2558

SQL 中常用的日期函数以及SQL中常见的日期转换

1.SQL 中常用的日期函数 当前的时间:now() 当前年月日curdate() 当前的时刻curtime() 日期的运算datediff('2020-10-20','1996-10-29') date_diff(time,time1):返回两个日期之间(time,time1)的天数 timediff(time,time1):两个日期相减 time-time1,返回 time 差值 timestampdiff(unit,begin,end):返回end-begin的结果,其中begin和end.

Without_1113的博客 2170

AI穿透式智慧粮仓

本报告基于 2025-2026 年全国多地智慧粮储实践案例,系统分析了 "AI + 穿透式" 智慧粮储体系的技术架构、AI 算法应用、提质增效成效、区域差异化特点及未来发展趋势。该体系通过多模态感知、智能算法与管控平台的深度融合,实现粮食存储全流程精准感知、智能预警与科学调控,显著降低储粮损耗与运营成本,大幅提升储粮安全水平与管理效率。报告梳理了各地差异化实践路径,提出针对性发展建议,为推动我国粮食仓储高质量发展、筑牢国家粮食安全防线提供参考。

reset2021的博客 229

AutoSAR系列讲解 - 资料下载

学习资料下载汇总

雪云飞星的博客 4万+

关于日期格式你必须知道的坑( yyyy-MM-dd HH:mm:ss SSS)

参考了各位大神的文章,这里忘了引入链接...... 凑一波热度,2019年最后两天日期显示为2020-12-31 06:07:59 常用格式为:yyyy-MM-ddHH:mm:ss 以2019-12-31 06:07:59:666时间为例: Letter 含义 Example y 年 yyyy------>2019 M 月 MM---...

qq_37358143的博客 14万+

[从零开始学习FPGA编程-18]:快速入门篇 - 操作步骤2-6- VerilogHDL时序电路语法分析(以计数器为例)

目录前言:第1章 功能模块代码:counter.v第2章 驱动代码:tcounter.v前文以及阐述了VerilogHDL基本语法,本文将以modelsim自带的计数器程序来解读VerilogHDL的语法。代码路径:

文火冰糖(王文兵)的博客 7万+

又双叒有兄弟因为 YYYY-MM-dd 被叫去加班了...

今天上海降温到零下了,一点起床的欲望都没,想着直接睡到吃午饭吧。结果看到群里小伙伴吐槽一早被叫起来修Bug,定睛一看,要修的BUG居然又是之前说过很多次的YYYY-MM-dd问题,这个之前文章就写过几次了《听说又有兄弟因为用YYYY-MM-dd被锤了…》,怎么还有人中招呢? 不过再想想,其实也正常,每一年都有新人,即使是老人,也可能因为跳槽接手已经存在问题的系统,当然也可能没关注DD,没看过之前的推送 图片 ?不管什么原因,也许

程序猿DD 5502

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

格式化时间用了YYYY-MM-dd,元旦当天老板喊我回去改Bug!

具体是什么原因哪? 这是因为Java语言中在特定的时间或者数字等数据上,平时你感觉一切都OK!但是在特定时间、特定环境就会出问题的情况!刚好格式化时间就算其中的一个! 2020年跨年的时候刚好是2019和2020交换的时候,于是就出现了格式化时间的问题,归其原因就是使用了"YYYY-MM-dd"格式化时间! YYYY 是 week-based-year,现在就已经 2020 年了,yyyy 还是 2019 年!

徐刘根的博客 7642

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

探讨 iOS 时间格式化:大写 YYYY-MM-dd 还是小写 yyyy-MM-dd

在 iOS 开发中,正确地格式化日期对于显示用户友好的信息至关重要。使用 DateFormatter 进行时间格式化时,格式字符串中的大小写字母会影响输出的结果。本文将探讨 YYYY-MM-dd 和 yyyy-MM-dd 这两种常见格式的区别,并解释为什么应该优先选择小写格式。在 iOS 开发中,理解并正确选择日期格式是至关重要的。大写 YYYY-MM-DD 和小写 yyyy-MM-dd 虽然看起来相似,但其应用场景和意义却大不相同。

lyh1083908486的博客 2591

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

时间类型转换(从“yyyyMMdd“格式转换为“yyyy年MM月dd日“格式)

【面试干货】时间类型转换(从"yyyyMMdd"格式转换为"yyyy年MM月dd日"格式)

✨ 欢迎来到【Seal ^_^ 的优快云博客】!✨ 4387

日期格式yyyy-MM-dd和YYYY-MM-dd有什么区别?

前几天写日期格式化工具类,自己做测试的时候,无意中发现一个好玩的问题,如果把format参数设置成YYYY-MM-DD,输出的结果很奇怪。 Date result1 = string2Date("2016-12-15", "yyyy-MM-dd"); System.out.println(result1); Date result2 = string2Date("2016-12-15", "YY

FreemanZhao的博客 7万+

日期格式yyyy-MM-dd和YYYY-MM-dd到底有什么不同

前言:以前根本就没有在意yyyy-MM-dd和YYYY-MM-dd二者之间的区别,知道最近读了一篇公众号文章才发现它们之间的微妙区别,先看下面代码: public static void main(String[] args){ Calendar calendar = Calendar.getInstance(); calendar.set(2019, Calend...

shikaiwang90的博客 4500

日期格式YYYY-MM-DD与yyyy-MM-dd的区别

比如2019年12月31日,用这两个格式 yyyy-MM-dd 与 YYYY-MM-DD 分别输入,结果一个显示2019年12月31日,另一个却显示2020年12月31日。 原来,前面格式为 YYYY 的,表示 week-based-year ,只要本周跨年,那么这周就算入下一年。而 yyyy 则是正正经经的年。 ...

qq_45069279的博客 9万+

几年前的项目用了YYYY-MM-dd,跨年夜老板喊我回去改Bug

点击上方“码农进阶之路”,选择“设为星标”回复“面经”获取面试资料昨天听一粉丝讲到自己的项目中因为格式化时间用到了"YYYY-MM-dd",元旦当天被喊回去改Bug,到底...

二师兄撒欢之地 1万+

详细介绍JAVA中日期 yyyy-MM-dd HH:mm:ss

文章目录问题描述灾难现场还原原因分析说明各字段的含义何为”前导0”参考 问题描述 使用new SimpleDateFormat(“yyyy-MM-DD HH:mm:ss”).parse(“2019-05-27 22:47:31”);构造出来的时间与预期的不符。 灾难现场还原 Date startDate = new SimpleDateFormat("yyyy-MM-DD HH:mm:ss")....

diyinqian的博客 6966

yyyy-MM-dd和YYYY-MM-dd的区别

yyyy-MM-dd和YYYY-MM-dd的区别java中的区别 java中的区别 先看一段代码 Calendar instance = Calendar.getInstance(); instance.set(2019,11,28); Date time = instance.getTime(); try { SimpleDateFormat yyyyFormat= new S...

hqn笔记分享 4926

YYYY-MM-dd跨年年份错误问题

一、问题描述 项目中每天执行的一个定时任务在 2019 年 12 月 29 日 - 2019 年 12 月 31 日这三天没有执行。 经排查,发现是在使用 SimpleDateFormat 格式化日期的时候,用了 “YYYY-MM-dd” 这个模式来格式化日期的,而没有用标准的 “yyyy-MM-dd”。 查阅了一些资料发现 “YYYY” 这种大 Y 年份模式会在某一天所在的周(本周日 - 下周六...

. 3097
上一篇: Jenkins系列之安装及配置详细教程
下一篇: 工具 | XMind 2020
Hugh Pro
博客等级 码龄16年 6粉丝 22原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值