Java与mysql的时间格式化问题,获取时间的上下午
在项目中经常会遇到对时间进行格式化的问题,一次在对应用中发现,使用Java的SimpleDateFormat格式化时间,获取到的是上午,而使用mysql查询获取到的时间则是下午,导致两者不一致的问题,经过仔细检查,才发现这是一个特别小的问题,千万不要粗心大意啊。
1、Java格式化时间:
import java.text.SimpleDateFormat;
import java.util.Date;
import com.sun.org.apache.xerces.internal.impl.xpath.regex.ParseException;
public class TestDateFormat {
public static void main(String[] args) {
System.out.println(timeformat("2018-03-14 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 (ParseException | java.text.ParseException e) {
e.printStackTrace();
}
return dateformat;
}
}
打印的结果为:
Wed Mar 14 00:10:00 CST 2018
上午
2、mysql时间格式化:
SELECT date_format( '2018-03-14 12:10', '%Y-%m-%d %p' ) date
查询结果为:
2018-03-14 PM
为什么会出现两者不一样的情况呢?仔细查看代码才发现,在把String的时间解析成date的时候,是使用的12小时制的时间(hh),结果就是12:10 就办成了 00:10 ,最后在格式化上下午的时候,程序就会认为它是上午了
解决方案:
把Java代码中的的时间格式化修改一下就好了,
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm");
附Java,mysql时间格式化,指定字符串的含义表,供大家参考
1、Java
日期和时间模式
日期和时间格式由日期和时间模式 字符串指定。在日期和时间模式字符串中,未加引号的字母 '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
2、mysql
根据format 字符串安排date 值的格式。
以下说明符可用在 format 字符串中:
说明符 说明
%a 工作日的缩写名称 (Sun..Sat)
%b 月份的缩写名称 (Jan..Dec)
%c 月份,数字形式(0..12)
%D 带有英语后缀的该月日期 (0th, 1st, 2nd, 3rd, ...)
%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 上午(AM)或下午( PM)
%r 时间 , 12小时制 (小时hh:分钟mm:秒数ss 后加 AM或PM)
%S 秒 (00..59)
%s 秒 (00..59)
%T 时间 , 24小时制 (小时hh:分钟mm:秒数ss)
%U 周 (00..53), 其中周日为每周的第一天
%u 周 (00..53), 其中周一为每周的第一天
%V 周 (01..53), 其中周日为每周的第一天 ; 和 %X同时使用
%v 周 (01..53), 其中周一为每周的第一天 ; 和 %x同时使用
%W 工作日名称 (周日..周六)
%w 一周中的每日 (0=周日..6=周六)
%X 该周的年份,其中周日为每周的第一天, 数字形式,4位数;和%V同时使用
%x 该周的年份,其中周一为每周的第一天, 数字形式,4位数;和%v同时使用
%Y 年份, 数字形式,4位数
%y 年份, 数字形式 (2位数)
%% ‘%’文字字符
所有其它字符都被复制到结果中,无需作出解释。
注意, ‘%’字符要求在格式指定符之前。
月份和日期说明符的范围从零开始,原因是 MySQL允许存储诸如 '2004-00-00'的不完全日期.
感慨:大多数的情况下,我们所认为的程序问题,都来源于程序员本身,工作决定了我们一定要认真谨慎,这样就会少一些奇葩的问题。