Java与mysql的时间格式化问题,获取时间的上下午

在项目中经常会遇到对时间进行格式化的问题,一次在对应用中发现,使用Java的SimpleDateFormat格式化时间,获取到的是上午;而使用mysql查询获取到的时间则是下午,导致两者不一致的问题,经过仔细检查,才发现这是一个特别小的问题,千万不要粗心大意啊!

Java时间格式化

java 复制代码
import java.text.SimpleDateFormat;
import java.util.Date;
​
public class TestDateFormat {
​
    public static void main(String[] args) {
        System.out.println(timeformat("2023-09-15 12:10"));
    }
​
    public static String timeformat(String strDate){
        String dateformat = "";
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd hh:mm");
        try {
            Date date = sdf.parse(strDate);
            System.out.println(date);
            dateformat = new SimpleDateFormat("a").format(date);
        } catch (Exception e) {
            e.printStackTrace();
        }
        return dateformat;
    }
}

打印的结果为:

yaml 复制代码
Fri Sep 15 00:10:00 CST 2023
上午

mysql时间格式化

sql 复制代码
SELECT date_format( '2023-09-15 12:10', '%Y-%m-%d %p' ) date

查询结果为:

yaml 复制代码
2023-09-15 PM

问题分析

为什么会出现两者不一样的情况呢?仔细查看代码才发现,在把String的时间解析成date的时候,是使用的12小时制的时间(hh),结果就是12:10 就办成了 00:10 ,最后在格式化上下午的时候,程序就会认为它是上午了

解决方案

把Java代码中的的时间格式化修改一下就好了,

ini 复制代码
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm"); 

时间格式化字符描述

附Java,mysql时间格式化,指定字符串的含义表,供大家参考

Java文档参考

SimpleDateFormat 是一个以与语言环境有关的方式来格式化和解析日期的具体类。它允许进行格式化(日期 -> 文本)、解析(文本 -> 日期)和规范化。

SimpleDateFormat 使得可以选择任何用户定义的日期-时间格式的模式。但是,仍然建议通过 DateFormat 中的 getTimeInstancegetDateInstancegetDateTimeInstance 来创建日期-时间格式器。每一个这样的类方法都能够返回一个以默认格式模式初始化的日期/时间格式器。可以根据需要使用 applyPattern 方法来修改格式模式。

日期和时间模式

日期和时间格式由日期和时间模式 字符串指定。在日期和时间模式字符串中,未加引号的字母 'A''Z''a''z' 被解释为模式字母,用来表示日期或时间字符串元素。文本可以使用单引号 (') 引起来,以免进行解释。"''" 表示单引号。所有其他字符均不解释;只是在格式化时将它们简单复制到输出字符串,或者在解析时与输入字符串进行匹配。

定义了以下模式字母(所有其他字符 'A''Z''a''z' 都被保留):

字母 日期或时间元素 表示 示例
G Era 标志符 Text AD
y Year 1996; 96
M 年中的月份 Month July; Jul; 07
w 年中的周数 Number 27
W 月份中的周数 Number 2
D 年中的天数 Number 189
d 月份中的天数 Number 10
F 月份中的星期 Number 2
E 星期中的天数 Text Tuesday; Tue
a Am/pm 标记 Text PM
H 一天中的小时数(0-23) Number 0
k 一天中的小时数(1-24) Number 24
K am/pm 中的小时数(0-11) Number 0
h am/pm 中的小时数(1-12) Number 12
m 小时中的分钟数 Number 30
s 分钟中的秒数 Number 55
S 毫秒数 Number 978
z 时区 General time zone Pacific Standard Time; PST; GMT-08:00
Z 时区 RFC 822 time zone -0800
Mysql文档参考

根据format 字符串安排date 值的格式。 以下说明符可用在 format 字符串中:

说明符 描述
%a 工作日的缩写名称(Sun .. Sat)
%b 月份缩写名称(Jan .. Dec)
%c 月份,数字(0 .. 12)
%D 带英文后缀(每月0th1st2nd3rd...的月份)
%d 每月的某天,数字(00 .. 31)
%e 每月的某天,数字(0 .. 31)
%f 微秒(000000 .. 999999)
%H 小时(00 .. 23)
%h 小时(01 .. 12)
%I 小时(01 .. 12)
%i 分钟,数字(00 .. 59)
%j 一年中的某天(001 .. 366)
%k 小时(0 .. 23)
%l 小时(1 .. 12)
%M 月名称(January .. December)
%m 月份,数字(00 .. 12)
%p AMPM
%r 时间 12 小时(* hh:mm:ss *,后跟AMPM)
%S 秒(00 .. 59)
%s 秒(00 .. 59)
%T 时间 24 小时(* hh:mm:ss *)
%U 周(00 .. 53),其中星期日是一周的第一天; WEEK()模式 0
%u 周(00 .. 53),其中星期一是一周的第一天; WEEK()模式 1
%V 周(01 .. 53),其中星期日是一周的第一天; WEEK()模式 2;与%X一起使用
%v 周(01 .. 53),其中星期一是一周的第一天; WEEK()模式 3;与%x一起使用
%W 工作日名称(Sunday .. Saturday)
%w 星期几(0 =星期日.. 6 =星期六)
%X 星期的年份,其中星期日是星期的第一天,数字,四位数;与%V一起使用
%x 一周的年份,其中星期一是一周的第一天,数字,四位数;与%v一起使用
%Y 年,数字,四位数
%y 年,数字(两位数字)
%% Literals%字符
%x * x *,对于上面未列出的任何" * x *"

所有其它字符都被复制到结果中,无需作出解释。 注意, '%'字符要求在格式指定符之前。

月份和日期说明符的范围从零开始,原因是 MySQL允许存储诸如 '2004-00-00'的不完全日期.

最后总结

在大多数情况下,我们所遇到的程序问题源于程序员自身,而不是工作本身。因此,我们必须保持认真和谨慎的态度,以减少出现奇怪问题的可能性。正如名言所说,'精益求精,勿以恶小而为之'。只有通过努力和专注,我们才能避免那些不必要的麻烦,确保程序的顺利运行。

相关推荐
ningqw2 小时前
SpringBoot 常用跨域处理方案
java·后端·springboot
你的人类朋友2 小时前
vi编辑器命令常用操作整理(持续更新)
后端
胡gh2 小时前
简单又复杂,难道只能说一个有箭头一个没箭头?这种问题该怎么回答?
javascript·后端·面试
一只叫煤球的猫3 小时前
看到同事设计的表结构我人麻了!聊聊怎么更好去设计数据库表
后端·mysql·面试
uzong3 小时前
技术人如何对客做好沟通(上篇)
后端
颜如玉4 小时前
Redis scan高位进位加法机制浅析
redis·后端·开源
遇见你的雩风4 小时前
【MySQL】CRUD基础详解
数据库·mysql
Moment4 小时前
毕业一年了,分享一下我的四个开源项目!😊😊😊
前端·后端·开源
why技术5 小时前
在我眼里,这就是天才般的算法!
后端·面试
绝无仅有5 小时前
Jenkins+docker 微服务实现自动化部署安装和部署过程
后端·面试·github