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'的不完全日期.

最后总结

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

相关推荐
陈序缘6 分钟前
Rust 力扣 - 198. 打家劫舍
开发语言·后端·算法·leetcode·rust
yyycqupt18 分钟前
数据库连接池(二)
linux·数据库·c++·后端·单例模式
techdashen37 分钟前
Go context.Context
开发语言·后端·golang
凡人的AI工具箱39 分钟前
40分钟学 Go 语言高并发:Select多路复用
开发语言·后端·架构·golang
ModelBulider44 分钟前
SpringMVC应用专栏介绍
java·开发语言·后端·spring·springmvc
恬淡虚无真气从之1 小时前
go 结构体方法
开发语言·后端·golang
m0_748230212 小时前
【Spring Boot】Spring AOP中的环绕通知
spring boot·后端·spring
潘多编程2 小时前
动态定时任务在Spring Boot中集成Quartz的实践
java·spring boot·后端
2401_857636392 小时前
Spring Boot OA系统:企业办公自动化的创新实践
java·spring boot·后端
小菜日记^_^2 小时前
Maven高级篇
java·spring boot·后端·spring·maven·intellij-idea·mybatis