2013年10月15日星期二

JAVA处理日期时间常用方法:

1.java.util.Calendar 
Calendar 类是一个抽象类,它为特定瞬间与一组诸如 YEAR、MONTH、DAY_OF_MONTH、HOUR 等 日历字段之间的转换提供了一些方法,并为操作日历字段(例如获得下星期的日期)提供了一些方法。瞬间可用毫秒值来表示,它是距历元(即格林威治标准时间 1970 年 1 月 1 日的 00:00:00.000,格里高利历)的偏移量。 

例: 
Java代码  收藏代码
  1. Calendar cal = Calendar.getInstance();//使用默认时区和语言环境获得一个日历。   
  2. cal.add(Calendar.DAY_OF_MONTH, -1);//取当前日期的前一天.   
  3.   
  4. cal.add(Calendar.DAY_OF_MONTH, +1);//取当前日期的后一天.   
  5.   
  6. //通过格式化输出日期   
  7. java.text.SimpleDateFormat format = new java.text.SimpleDateFormat("yyyy-MM-dd");   
  8.   
  9. System.out.println("Today is:"+format.format(Calendar.getInstance().getTime()));   
  10.   
  11. System.out.println("yesterday is:"+format.format(cal.getTime()));   


得到2007-12-25日期: 
Java代码  收藏代码
  1. Calendar calendar = new GregorianCalendar(20071125,0,0,0);   
  2. Date date = calendar.getTime();   
  3. System.out.println("2007 Christmas is:"+format.format(date));   

java月份是从0-11,月份设置时要减1. 

GregorianCalendar构造方法参数依次为:年,月-1,日,时,分,秒. 

取日期的部分: 
Java代码  收藏代码
  1. int year =calendar.get(Calendar.YEAR);   
  2.   
  3. int month=calendar.get(Calendar.MONTH)+1;   
  4.   
  5. int day =calendar.get(Calendar.DAY_OF_MONTH);   
  6.   
  7. int hour =calendar.get(Calendar.HOUR_OF_DAY);   
  8.   
  9. int minute =calendar.get(Calendar.MINUTE);   
  10.   
  11. int seconds =calendar.get(Calendar.SECOND);   


取月份要加1. 

判断当前月份的最大天数: 
Java代码  收藏代码
  1. Calendar cal = Calendar.getInstance();   
  2. int day=cal.getActualMaximum(Calendar.DAY_OF_MONTH);   
  3. System.out.println(day);   


2.java.util.Date 
Java代码  收藏代码
  1. java.util.Date today=new java.util.Date();   
  2. System.out.println("Today is "+formats.format(today));   


取当月的第一天: 
Java代码  收藏代码
  1. java.text.SimpleDateFormat format = new java.text.SimpleDateFormat("yyyy-MM-01");   
  2. java.util.Date firstDay=new java.util.Date();   
  3. System.out.println("the month first day is "+formats.format(firstDay));   

取当月的最后一天: 
Java代码  收藏代码
  1.    
  2. Calendar cal = Calendar.getInstance();   
  3. int maxDay=cals.getActualMaximum(Calendar.DAY_OF_MONTH);   
  4. java.text.Format formatter3=new java.text.SimpleDateFormat("yyyy-MM-"+maxDay);   
  5. System.out.println(formatter3.format(cal.getTime()));   


求两个日期之间相隔的天数: 
Java代码  收藏代码
  1. java.text.SimpleDateFormat format = new java.text.SimpleDateFormat("yyyy-MM-dd");   
  2. java.util.Date beginDate= format.parse("2007-12-24");   
  3. java.util.Date endDate= format.parse("2007-12-25");   
  4. long day=(date.getTime()-mydate.getTime())/(24*60*60*1000);   
  5. System.out.println("相隔的天数="+day);   

一年前的日期: 
Java代码  收藏代码
  1. java.text.Format formatter=new java.text.SimpleDateFormat("yyyy-MM-dd");   
  2. java.util.Date todayDate=new java.util.Date();   
  3. long beforeTime=(todayDate.getTime()/1000)-60*60*24*365;   
  4. todayDate.setTime(beforeTime*1000);   
  5. String beforeDate=formatter.format(todayDate);   
  6. System.out.println(beforeDate);   

一年后的日期: 
Java代码  收藏代码
  1. java.text.Format formatter=new java.text.SimpleDateFormat("yyyy-MM-dd");   
  2. java.util.Date todayDate=new java.util.Date();   
  3. long afterTime=(todayDate.getTime()/1000)+60*60*24*365;   
  4. todayDate.setTime(afterTime*1000);   
  5. String afterDate=formatter.format(todayDate);   
  6. System.out.println(afterDate);   

求10小时后的时间 
Java代码  收藏代码
  1. java.util.Calendar Cal=java.util.Calendar.getInstance();   
  2. Cal.setTime(dateOper);   
  3. Cal.add(java.util.Calendar.HOUR_OF_DAY,10);   
  4. System.out.println("date:"+forma.format(Cal.getTime()));   

求10小时前的时间 
Java代码  收藏代码
  1. java.util.Calendar Cal=java.util.Calendar.getInstance();   
  2. Cal.setTime(dateOper);   
  3. Cal.add(java.util.Calendar.HOUR_OF_DAY,-10);   
  4. System.out.println("date:"+forma.format(Cal.getTime()));   

3.java.sql.Date 
继承自java.util.Date,是操作数据库用的日期类型 
Java代码  收藏代码
  1. java.sql.Date sqlDate = new java.sql.Date(java.sql.Date.valueOf("2007-12-25").getTime());   

日期比较:简单的比较可以以字符串的形式直接比较,也可使用 
java.sql.Date.valueOf("2007-03-08").compareTo(java.sql.Date.valueOf("2007-03-18"))方式来比较日期的大小.也可使用java.util.Date.after(java.util.Date)来比较. 

相差时间: 
long difference=c2.getTimeInMillis()-c1.getTimeInMillis(); 
相差天数:long day=difference/(3600*24*1000) 
相差小时:long hour=difference/(3600*1000) 
相差分钟:long minute=difference/(60*1000) 
相差秒: long second=difference/1000 

补充: 
Java代码  收藏代码
  1. DateFormat df=new SimpleDateFormat("yyyy-MM-dd EE hh:mm:ss");   
  2. System.out.println(df.format(new Date()));   
  3. Date date = new Date();   
  4. DateFormat shortDate=DateFormat.getDateTimeInstance(DateFormat.SHORT, DateFormat.SHORT);   
  5. DateFormat mediumDate =DateFormat.getDateTimeInstance(DateFormat.MEDIUM, DateFormat.MEDIUM);   
  6. DateFormat longDate =DateFormat.getDateTimeInstance(DateFormat.LONG, DateFormat.LONG);   
  7. DateFormat fullDate =DateFormat.getDateTimeInstance(DateFormat.FULL, DateFormat.FULL);   
  8.   
  9. system.out.println(shortDate.format(date));   
  10. System.out.println(mediumDate.format(date));   
  11. System.out.println(longDate.format(date));   
  12. System.out.println(fullDate.format(date));   
  13.   
  14. 08-4-15 下午3:24   
  15. 2008-4-15 15:24:31   
  16. 2008415日 下午032431秒   
  17. 2008415日 星期二 下午032431秒CST   
  18.   
  19.   
  20. Calendar c = Calendar.getInstance();   
  21.   
  22. c.add(Calendar.MONTH, 1); // 目前時間加1個月   
  23. System.out.println(df.format(c.getTime()));   
  24.   
  25. c.add(Calendar.HOUR, 3); // 目前時間加3小時   
  26. System.out.println(df.format(c.getTime()));   
  27.   
  28. c.add(Calendar.YEAR, -2); // 目前時間減2年   
  29. System.out.println(df.format(c.getTime()));   
  30.   
  31. c.add(Calendar.DAY_OF_WEEK, 7); // 目前的時間加7天   
  32. System.out.println(df.format(c.getTime()));   

JAVA中的时间操作


java中的时间操作不外乎这四种情况:
1、获取当前时间
2、获取某个时间的某种格式
3、设置时间
4、时间的运算
好,下面就针对这四种情况,一个一个搞定。

一、获取当前时间

有两种方式可以获得,第一种,使用Date类。
j2SE的包里有两个Date类,一个是java.sql.Date,一个是java.util.Date
这里,要使用java.util.Date。获取当前时间的代码如下
Date date = new Date();
date.getTime();
还有一种方式,使用System.currentTimeMillis();

这两种方式获得的结果是一样的,都是得到一个当前的时间的long型的时间的毫秒值,这个值实际上是当前时间值与1970年一月一号零时零分零秒相差的毫秒数。
当前的时间得到了,但实际的应用中最后往往不是要用这个long型的东西,用户希望得到的往往是一个时间的字符串,比如“2006618号”,或“2006-06-18”,老外可能希望得到的是“06-18-2006”,诸如此类等等。这就是下一个要解决的问题

二、获取某个时间的某种格式

获取时间的格式,需要用到一个专门用于时间格式的类java.text.SimpleDateFormat
首先,定义一个SimpleDateFormat变量
SimpleDateFormat sdf = new SimpleDateFormat("",Locale.SIMPLIFIED_CHINESE);
这个构造函数的定义如下:
SimpleDateFormat(String pattern, Locale locale)
第一个参数pattern,我们后面再解释,这里我们使用一个"",第二个参数,是用来设置时区的,这里用到了java.util.Locale这个类,这个类了面定义了很多静态变量,直接拿过来用就OK,我们把时区设置为Locale.SIMPLIFIED_CHINESE,只看名字,这个静态变量的意义已经很清楚了。

接下来我们使用这个SimpleDateFormat把当前时间格式化为一个如下格式的时间字符串“XXXXXXXX_XXXXXX秒”,代码:
sdf.applyPattern("yyyy年MM月dd日_HH时mm分ss秒");
String timeStr = sdf.format(new Date());

获取时间格式的函数是format,这个函数的参数是java.util.Date对象,这个没有什么花头。
要说明一下的是这个pattern,所谓的模式。这里,yyyy,MM,dd等,这就是模式。
我们可以在SimpleDateFormat的构造函数中指定模式,比如
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd",Locale.SIMPLIFIED_CHINESE);
也可以获取时间格式的时候使用applyPattern函数临时指定,上面的例子就是这样。
什么字符代表什么,这是j2se约定好的,设置模式的时候,我们可以使用约定好的字符加上任何我们想要的字符串。
j2se对字符所代表的模式的约定列表如下:


LetterDate or Time ComponentPresentation
GEra designatorText
yYearYear
MMonth in yearMonth
wWeek in yearNumber
WWeek in monthNumber
DDay in yearNumber
dDay in monthNumber
FDay of week in monthNumber
EDay in weekText
aAm/pm markerText 
HHour in day (0-23)Number
kHour in day (1-24)Number
KHour in am/pm (0-11) Number
h  Hour in am/pm (1-12) Number
m  Minute in hour Number
s  Second in minute Number
S  Millisecond Number  
z  Time zone  General time zone 
Z  Time zone RFC 822 time zone 
三,设置时间

现在设置时间,推荐 使用java.util.Calendar类来进行操作,因为java.util.Date类很多方法都过时了,
Calendar 类有很多重载的设置时间的方法
我们可以针对于某一项进行设置,也可以同时进行很多设置
voidset(int field, int value)
          将给定的日历字段设置为给定值。
 voidset(int year, int month, int date)
          设置日历字段 YEARMONTH 和 DAY_OF_MONTH 的值。
 voidset(int year, int month, int date, int hourOfDay, int minute)
          设置日历字段 YEARMONTHDAY_OF_MONTHHOUR_OF_DAY 和 MINUTE 的值。
 voidset(int year, int month, int date, int hourOfDay, int minute, int second)
          设置字段 YEARMONTHDAY_OF_MONTHHOURMINUTE 和 SECOND 的值。
其中第一个就是给特定的字段设值,后面三个就是针对多个字段赋值

四,时间运算

时间的运算,无外乎就是加加减减,然后比较谁早谁晚而已,这些需求JAVA的API已经帮我们实现的很好了。一般比较时间的可以用如下的方法
abstract  voidadd(int field, int amount)
          根据日历的规则,为给定的日历字段添加或减去指定的时间量。
 booleanafter(Object when)
          判断此 Calendar 表示的时间是否在指定 Object 表示的时间之后,返回判断结果。
 booleanbefore(Object when)
          判断此 Calendar 表示的时间是否在指定 Object 表示的时间之前,返回判断结果。

第一个是给某个字段加上某个数量的时间,虽然这个方法名叫add ,我们要减也是调用它的,只不过我们传入的是负数。

其实JAVA对时间操作的支持还是挺丰富的。希望大家的日常的使用中有更多的发现。

张维迎:教育经费在比赛花钱 清华没花完反被罚

北京大学光华管理学院经济学教授、知名经济学家张维迎今日在欧美同学会100周年北京论坛上表示,目前中国教育经费占GDP总值的4%,教育经费腐败和科研经费腐败十分严重,如果选拔人才体制不发生根本性改变,则容易造成教育经费越多,问题越多。

张维迎指出,现目前各高校都争相索要经费,然而经费如果花不完,根据教育部规定是要受到处罚的,"去年清华大学就被罚了几千万,这到年底,各高校都在比赛花钱"。

"人才就是一个自由的产物,这个国家有了自由,它自然就会有人才;这个国家没有了自由,全天烧香磕头还是没有人才。"(胡雯)

以下是文字实录:

张维迎:谢谢。非常高兴在这个场合与大家交流。今天的主题是高端人才战略与创新型大国。我一听到高端就头疼,谈高端人才战略的时候你得知道谁是高端人才,实际上真正的高端人才我们真是不知道的,如果我们都知道了他就不再是高端人才。尤其与创新相关,所有的创新相关都是大部分人认识不到的事情。所以我个人认为,高端人才战略,从国家战略角度讲的话,我们需要正确的定位。

人才就是一个自由的产物。这个国家有了自由,它自然就会有人才;这个国家没有了自由,全天烧香磕头还是没有人才。所以我觉得这是我们国家如果真正要进入创新型国家,要发展的话,我觉得这是最基本的问题。

如果从从上往下选拔人才,提供各种优惠的待遇,总体我觉得效果其实并不好,看看我们的教育经费浪费了多少?看看我们的科研经费浪费了多少?科技部部长都忍不住了,说出来了,说科研经费的腐败非常的严重。我所知道的教育经费的腐败仍然非常的严重。教育经费已经达到了4%,但是我们的体制不改变的话,我觉得钱越多,问题越多。因为现在大家都在去争着去瓜分这些钱,而且有关部门规定,说这个经费一年花不完的话罚款。清华去年就罚了几千万。到年底了,都在比赛花钱。

所以我的观点很简单,如果真的为国家为着想,不要做太多的事,最重要的事就是给人们自由,尤其思想自由。诺贝尔奖得主何斯教授讲到,思想资产。如果一个国家人们不能自由的思考,不能自由的表达,这个国家要有创新是不可能的。还有一位讲过,说人类的进步都是由极少数提出的思想,然后由越来越多的人慢慢地接受了它,最终变成一个现实。所以我个人认为真正的高端人才战略,就应该得到自由的战略。谢谢。

院士痛批过度医疗:“输液大国”是医学界的羞耻

央广网北京10月14日消息 据中国之声《新闻纵横》报道,昨天《光明日报》刊发了中国科学院院士、北京大学神经科学研究所名誉所长韩济生的文章《在过度医疗背后》。文章通过一个个鲜活例子,让过度医疗问题再次摆在了人们面前。不只是医院,一些患者同样助长了过度医疗的风气。

什么是过度医疗呢?“过度医疗”说的是超过疾病实际需求的诊断和治疗行为,这其中包括过度检查和过度治疗,这不仅损害了患者利益更会影响身体健康。韩济生院士,这位从事医学研究超过半个世纪的老人,为什么会站出来批评 “过度医疗”?他又有着怎样的破解之道?

八十五岁高龄的韩济生是我国疼痛医学的开创者,他说作为一名神经生理学家,虽然不从事临床医学,但是对于目前存在的“过度医疗”现象,他仍然保持着一位医者的思考。究竟什么是过度医疗?韩济生院士举出鲜活的例子。

韩济生:我经常到医院里去,看到有些情况感觉到,举个例子:有了B超以后,甲状腺可以查出来有囊肿,这是非常多见的。可是老百姓就觉得会不会变癌,就要求切除。这个其实大多数都是不必要的,出现有一个医生,他一个上午就开13个甲状腺的手术。这个做医生的都懂的,这不是必要的。一个半天做13个甲状腺手术这种,这并不是一个很好的记录,实际上是过度医疗。

韩济生说,用B超为成人检查甲状腺,在北京地区有70%以上机会可查出有一个或几个良性囊肿。大部分医生认为可以听其自然,保持每年体检,继续观察;如有恶化趋向,及时手术,这是才是医道常规。

韩济生:不做手术,伴随终生的囊肿有的是。老百姓现在生活水平好了,就要求做。做医生的有这个义务来解释。医生并不是为了讨病人的好,或者是增加我们的收入。这些都不是我们做医生的本身的愿望。

病人对于病情治疗方案有误区,作为医生需要耐心解释,这是防止出现过度医疗的第一关。以晚期癌症患者的治疗为例,韩济生院士提到了不同医院两种截然不同的处理方式。一种是医生采取保守疗法,但是家属和医院都并不理解和支持。另一位医生则采取了放疗、化疗,花费数十万,而最后患病老人却在痛苦中死去。韩济生认为,这个时候除了医术,更需要一位医者的仁心。

韩济生:我们明知道到了某一个阶段的癌症,很多在治疗是没有必要的,特别是化疗、放疗,这个是要命的。本来癌症到了晚期以后,在加上放疗、加上化疗的时候,只会促使他免疫力下降,生存时间缩短。可是这种权衡得失,他是不必要的。既花了钱,又受了罪。我们医学界非常的普遍认为是这样。可有时候病人一再要求,就会出现这样。这位医生,我不提谁的名字的了,他说我宁可得罪病人,也给你做主了。这样我觉得是好的,是应该表扬的。

韩济生分析,患者的非理性要求与医院追求高GDP指标的愿望相结合,是造成过度医疗的原动力。他以“输液”为例指出:作为“输液大国”,患者对输液的依赖,这是医学界的羞耻。

韩济生:输液这件事情,在我们中国是特色。中国的输液比世界上哪个国家都高,你就看医院里面坐了一屋子几十个人在那输液。可大多数,90%以上,这种是可以口服的,就在那点滴。这是我们医疗中的羞耻。我认为,越打得多实际上是医学中不光彩的事情,成风了!这个也可以拿来医学上讨论讨论。

除此之外,想要把从利益角度滋生的过度医疗放进“笼子里”,韩济生认为,提高医学技术水平,并相应降低收费标准,这样可以使过度医疗无利可图。

韩济生:另外一个就是说,有的先进方法,我举了个例子,做一个甲状腺手术麻醉费用大概是在2000块左右。我做针刺麻醉一个首席科学家,有两个医院就做针刺麻醉,就可以把这个刺激电极放在穴位上,然后再加一点点局部麻醉。这样子不仅不要两千块,200块也就够了。恐怕就没有这个驱动力说一下子连着做13个手术。


对于解决过度医疗,韩济生院士开出了一剂药方:进行科普宣传和“医院挣钱要体面有度”的教育,及时引进最先进的技术,加上合理的单项收费标准,可以成为是解决过度医疗的诸多方案之一。

韩济生:医学是一个科学,我们要根据医生对医学的考虑来劝告别人怎么样做正确的方案。而不是一味地根据病人的要求。我满足了你,我还增加了收入,何乐而不为?但这个跟医学的良心是有悖的。医院挣钱要体面有度,这是我们北大的一个附属医院的院长给我讲。我觉得他讲的很好,就是说医院要增加收入,但是我们要体面,有程度,不是说你给我挣的钱越多越好。