java数据类型,Date类型为什么不行

&nbsp>&nbsp
&nbsp>&nbsp
&nbsp>&nbsp
Java编程经验技巧 谨慎使用Date和Time类
摘要:&java里提供的日期和时间类,java.sql.Date和java.sql.Time,只会从数据库里读取某部分值,这有时会导致丢失数据。例如一个包含:00:57PM的字段,读取日期时得到的是,而读取时间时得到的是5:00:57PM.你需要了解数据库里存储时间的精度。有些数据库,比如MySQL,精度为毫秒,然而另一些数据库,包括Oracle,存储SQLDATE类型数据时,毫秒部分的数据是不保存的。以下操作中容易出现不易被发现
&java里提供的日期和时间类,java.sql.Date和java.sql.Time,只会从数据库里读取某部分值,这有时会导致丢失数据。例如一个包含 5:00:57 PM的字段,读取日期时得到的是,而读取时间时得到的是5:00:57 PM. 你需要了解数据库里存储时间的精度。有些数据库,比如MySQL,精度为毫秒,然而另一些数据库,包括Oracle,存储SQL DATE类型数据时,毫秒部分的数据是不保存的。以下操作中容易出现不易被发现的BUG: 获得一个JAVA里的日期对象。 从数据库里读取日期 试图比较两个日期对象是否相等。如果毫秒部分丢失,本来认为相等的两个日期对象用Equals方法可能返回false。 java.sql.Timestamp类比java.util.Date类精确度要高。这个类包含了一个getTime()方法,但是它不会返回额外精度部分的数据,因此必须使用getNanos()方法。有毫微秒部分(即额外精度部分)的数值可能比没有这个部分的数值的大一个毫秒。如果你知道你使用的数据库保存了毫秒部分,可以用下面的代码获得的数值: long time=timestamp.getTime()+timestamp.getNanos()/1000000; 毫微秒的部分就是为什么一个java.sql.Timestamp对象不等于一个java.util.Date对象,而一个java.util.Date对象可能等于一个java.sql.Timestamp对象的原因。这使得equals方法应当保持的对称被打破了。 使用java.sql包中的时间相关的类是重要的,但是它们也可能导致人为的错误。 这是因为,这些类的复杂性虽然已经在javadoc里面清楚的描述了,但是由于这些类看上去很简单而很少有人看这些文档。
以上是的内容,更多
的内容,请您使用右上方搜索功能获取相关信息。
若你要投稿、删除文章请联系邮箱:zixun-group@service.aliyun.com,工作人员会在五个工作日内给你回复。
云服务器 ECS
可弹性伸缩、安全稳定、简单易用
&40.8元/月起
预测未发生的攻击
&24元/月起
为您提供0门槛上云实践机会
你可能还喜欢
你可能感兴趣
阿里云教程中心为您免费提供
Java编程经验技巧 谨慎使用Date和Time类相关信息,包括
的信息,所有Java编程经验技巧 谨慎使用Date和Time类相关内容均不代表阿里云的意见!投稿删除文章请联系邮箱:zixun-group@service.aliyun.com,工作人员会在五个工作日内答复
售前咨询热线
支持与服务
资源和社区
关注阿里云
Internationaljava Date类详解及使用总结
转载 & & 投稿:lqh
这篇文章主要介绍了java Date类详解及使用总结的相关资料,需要的朋友可以参考下
Java Date类的使用总结
Date类表示特定的瞬间,精确到毫秒。
有2种方法可以创建Date对象(这里不考虑已过时的构造函数)
1、public Date()——分配 Date 对象并初始化此对象,以表示分配它的时间(精确到毫秒)。
public void test1() {
Date date = new Date();
System.out.println(date);
Sun Oct 23 22:39:14 CST 2016
2、public Date(long date)——根据给定的毫秒值创建日期对象。
public void test2() {
long time = System.currentTimeMillis();
Date date = new Date(time);
System.out.println(date);
Sun Oct 23 22:41:42 CST 2016
介绍完了Date的构造函数后,接下来来看看日期与毫秒值的相互转换
1、public long getTime()——日期转毫秒值
通过getTime方法可以将一个日期类型转换为long类型的毫秒值
public void test3() {
Date date = new Date();
System.out.println(date.getTime());
2、public void setTime(long time)——毫秒值转日期
public void test4() {
long time = System.currentTimeMillis();
Date date = new Date();
date.setTime(time);
System.out.println(date);
Sun Oct 23 22:53:05 CST 2016
当然也可以通过构造函数public Date(long date)将毫秒值转为日期类型。
通常我们会比较2个日期的大小,Date类提供以下方法用来比较2个日期的相关操作
1、public boolean before(Date when)——测试此日期是否在指定日期之前,当且仅当此Date对象表示的瞬间比when表示的瞬间早,才返回true;否则返回false。
public void test5() {
Date date1 = new Date(1000);
Date date2 = new Date(2000);
System.out.println(date1.before(date2));
2、public boolean after(Date when)——测试此日期是否在指定日期之后,当且仅当此Date对象表示的瞬间比when表示的瞬间晚,才返回true;否则返回false。
public void test6() {
Date date1 = new Date(1000);
Date date2 = new Date(2000);
System.out.println(date1.after(date2));
3、public int compareTo(Date anotherDate)——比较两个日期的顺序。
如果参数Date等于此Date,则返回值0;如果此Date在Date参数之前,则返回小于0的值;如果此Date在Date参数之后,则返回大于0的值。
public void test7() {
Date date1 = new Date(1000);
Date date2 = new Date(2000);
System.out.println(date1.compareTo(date2));
感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!
您可能感兴趣的文章:
大家感兴趣的内容
12345678910
最近更新的内容
常用在线小工具java中的Date类为什么很多方法被废弃了_百度知道
java中的Date类为什么很多方法被废弃了
setMinutes(int i)Deprecated.
setSeconds(int i)Deprecated.
getSeconds()Deprecated.
getMinutes()Deprecatedint
getHours()Deprecated.
setHours(int i)Deprecated
我有更好的答案
因为有更好的方法出现了呗。。。API里写的很清楚 int
已过时。 从 JDK 1.1 开始,由 Calendar.get(Calendar.DAY_OF_MONTH) 取代。
已过时。 从 JDK 1.1 开始,由 Calendar.get(Calendar.DAY_OF_WEEK) 取代。
getHours()
已过时。 从 JDK 1.1 开始,由 Calendar.get(Calendar.HOUR_OF_DAY) 取代。
getMinutes()
已过时。 从 JDK 1.1 开始,由 Calendar.get(Calendar.MINUTE) 取代。
getMonth()
已过时。 从 JDK 1.1 开始,由 Calendar.get(Calendar.MONTH) 取代。
getSeconds()
已过时。 从 JDK 1.1 开始,由 Calendar.get(Calendar.SECOND) 取代。
采纳率:29%
Date类中有很多方法都标有删除线,是因为Date类在设计中有很多问题,如getYear指的是1900年以来的年数,getMonth是从0开始的。事实上,不止Date类,Java的其实时间相关类都存在设计问题,以下举些例子,并提供解决方案。我们通常使用 Date和Calander用作时间处理,其实会有两个问题:1.Date的缺陷,我们知道 Date的setYear和getYear等函数是删除线显示的原因在:比如今天是日,那么获取的年竟然是109,所以是有问题的2.Calender常常用于时间的回卷,经常使用的就是roll(Day_of_Year,-7)就是七天前但是如果是日,那么七天前是日,而非2008年,这是因为它只对天回卷了,年没有回卷3、针对这些问题,提供一套日期工具类:import org.apache.log4j.Limport java.text.ParseEimport java.text.SimpleDateFimport java.util.Cimport java.util.Dpublic class AdDateUtil {
private static Logger logger = Logger.getLogger(AdDateUtil.class);
static public String getNowStr(String format) {
SimpleDateFormat sdf = new SimpleDateFormat(format);
String now = sdf.format(new Date());
static public Date getFormatDate(String date, String format) {
SimpleDateFormat sdf = new SimpleDateFormat(format);
Date d = new Date();
d = sdf.parse(date);
} catch (ParseException e) {
logger.error(e);
static public String getDateStr(Date date, String format) {
SimpleDateFormat sdf = new SimpleDateFormat(format);
String d = sdf.format(date);
static public String getPadZeroString(String s, int size) {
StringBuffer sb = new StringBuffer();
for (int i = 0; i & (size - s.length()); i++) {
sb.append(&0&);
sb.append(s);
return sb.toString();
* 得到某月的天数
* @param year
* @param month
static public int getDayCountOfMonth(String year, String month) {
Calendar cal = Calendar.getInstance();
cal.set(Calendar.YEAR, Integer.parseInt(year));
// 月,因为Calendar里的月是从0开始,所以要-1
cal.set(Calendar.MONTH, Integer.parseInt(month) - 1);
return cal.getActualMaximum(Calendar.DAY_OF_MONTH);
static public String getYesterday(String format) {
SimpleDateFormat df = new SimpleDateFormat(format);
Calendar now = Calendar.getInstance();
now.roll(Calendar.DAY_OF_YEAR, -1); //昨天
return df.format(now.getTime());
* 获取和今天附近的某天
* @param format
* @param diff
static public String getADay(String format, int diff) {
SimpleDateFormat df = new SimpleDateFormat(format);
Calendar now = Calendar.getInstance();
int beforeM = now.get(Calendar.MONTH);
now.roll(Calendar.DAY_OF_YEAR, diff); //
int nowM = now.get(Calendar.MONTH);
//必须进行日期处理,否则日前七天是
if (nowM & beforeM) {
now.roll(Calendar.YEAR, -1);
return df.format(now.getTime());
static public String getTomorrow(String format) {
SimpleDateFormat df = new SimpleDateFormat(format);
Calendar now = Calendar.getInstance();
now.roll(Calendar.DAY_OF_YEAR, 1); //明天
return df.format(now.getTime());
* 得到最近num天的全部日期
* 1.日期是从昨天开始算的.
* 2.如果num=2 , 日期是 ,则返回的结果为 、
* @param num
public static String[] getDaysByNum(int num, String date) {
SimpleDateFormat sdf = new SimpleDateFormat(&yyyy-MM-dd&);
String[] result = {
Calendar cal = Calendar.getInstance();
cal.setTime(getDateFromString(date, &yyyy-MM-dd&));
//最近一周
result = new String[num];
for (int i = i & 0; i--) {
cal.add(Calendar.DAY_OF_YEAR, -1);
result[i - 1] = sdf.format(new Date(cal.getTimeInMillis()));
public static Date getDateFromString(String dateStr, String format) {
if ((dateStr == null) || (format == null)) {
throw new Exception(&数据类型异常& + dateStr + &|& + format);
} catch (Exception e) {
logger.error(&数据类型异常:& + e);
SimpleDateFormat df = new SimpleDateFormat(format);
date = df.parse(dateStr);
} catch (Exception ex) {
logger.error(ex);
return new Date();
static public int getNowYear() {
Calendar cal = Calendar.getInstance();
return cal.get(Calendar.YEAR);
static public int getNowMonth() {
Calendar cal = Calendar.getInstance();
return cal.get(Calendar.MONTH) + 1;
public static String[] getMonthRang(String year, String month) {
String beginDate = year + &-& + month + &-01&;
String endDate = year + &-& + month + &-& +
getDayCountOfMonth(year, month);
return getDaysByRang(beginDate, endDate);
public static String[] getDaysByRang(String beginDate, String endDate) {
SimpleDateFormat sdf = new SimpleDateFormat(&yyyy-MM-dd&);
//得到两个日期间相差多少天
int num = dateDiff(beginDate, endDate);
if (num & 0) {
//颠倒一下日期
String tmp = beginD
beginDate = endD
String[] result = {
Calendar cal = Calendar.getInstance();
cal.setTime(sdf.parse(beginDate));
} catch (ParseException e) {
e.printStackTrace();
num = num + 1; //把开始和结束日期都包含进去
result = new String[num];
for (int i = 0; i & i++) {
if (i & 0) {
cal.add(Calendar.DAY_OF_YEAR, 1);
result[i] = sdf.format(new Date(cal.getTimeInMillis()));
public static int dateDiff(String beginDate, String endDate) {
SimpleDateFormat sdf = new SimpleDateFormat(&yyyy-MM-dd&);
Date date =
date = sdf.parse(endDate);
} catch (ParseException e) {
date = new Date();
e.printStackTrace();
long end = date.getTime();
date = sdf.parse(beginDate);
} catch (ParseException e) {
date = new Date();
e.printStackTrace();
long begin = date.getTime();
long day = (end - begin) / (1000 * 3600 * 24); //除1000是把毫秒变成秒
return Integer.parseInt(Long.toString(day));
public static void main(String[] args) {
System.out.println(AdDateUtil.getADay(&yyyy-MM-dd&, -7));
使用Calendar了
为您推荐:
其他类似问题
您可能关注的内容
java date类的相关知识
换一换
回答问题,赢新手礼包
个人、企业类
违法有害信息,请在下方选择后提交
色情、暴力
我们会通过消息、邮箱等方式尽快将举报结果通知您。博主最新文章
博主热门文章
您举报文章:
举报原因:
原文地址:
原因补充:
(最多只允许输入30个字)12:25 提问
java对象问题。还有angularjs
后台无法接收Date类型
public String addEmployee(Employee employee){ //前台传送数据使用bean接收
System.out.println(employee + "状态:"+(employee==null));//当传送空数据时打印情况如下
---打印情况---& “ Employee [id=null, name=null, pwd=null, sex=null, birth=null, headImage=null, idCard=null, number=null, tel=null, qq=null, email=null] 状态:false ” 问题:此处Employee所有成员变量为null
为什么打印Employee时employee==null 不是true 而是false
顺带问个问题:angularjs传送Date类型后台 无法接收数据类型错误
private D //这个是后台类型
$scope.addEmpl.birth = new Date();//前台类型
input type="Date" id="birth" ng-model="addEmpl.birth//html绑定
birth:Wed Oct 18 :07 GMT+0800 (中国标准时间) // 前台取得值“”状态码400
后台接收依旧为上面的java bean
按赞数排序
angularjs接到的时间是时间戳,不能用date接
$scope.emplBirth = new Date(); $scope.addEmpl.birth = new Date();$scope.addEmpl.birth = $filter("jsonDate")($scope.emplBirth, "yyyy-MM-dd HH:mm:ss");
filter("jsonDate", function($filter) {
return function(input, format) {
//先得到时间戳
var timestamp = Number(input.replace(/\/Date((\d+))\//, "$1"));
//转成指定格式
return $filter("date")(timestamp, format);
我改成这样了还是报错
TypeError: input.replace is not a function
打印的地方不是true是因为 那个employee是个对象不是null
仅仅是employee里面的属性数据为空。
后面的那个 日期数据经过传输就变成字符串或数字了吧? 。日期转换有很多插件的。。。。
准确详细的回答,更有利于被提问者采纳,从而获得C币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!
其他相关推荐}

我要回帖

更多关于 java数据类型 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信