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

1、问题概述

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

2、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
上午

3、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 ,最后在格式化上下午的时候,程序就会认为它是上午了

4、解决方案:

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

SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm");  

5、时间格式化含义表

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

5.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

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

6、最后总结

感慨:大多数的情况下,我们所认为的程序问题,都来源于程序员本身,工作决定了我们一定要认真谨慎,这样就会少一些奇葩的问题。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值