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型的东西,用户希望得到的往往是一个时间的字符串,比如“2006年6月18号”,或“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把当前时间格式化为一个如下格式的时间字符串“XXXX年XX月XX日_XX时XX分XX秒”,代码:

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对字符所代表的模式的约定列表如下:


Letter Date or Time Component Presentation
G Era designator Text
y Year Year
M Month in year Month
w Week in year Number
W Week in month Number
D Day in year Number
d Day in month Number
F Day of week in month Number
E Day in week Text
a Am/pm marker Text
H Hour in day (0-23) Number
k Hour in day (1-24) Number
K Hour 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


1.处理数据库,有DATE Java.sql.Date 日期,
TIME Java.sql.Time 时戳,TIMESTAMP Java.sql.Timestamp 当日日期和时间,
对应的ResultSet的方法
DATE java.sql.Date java.sql.Date getDate()
TIME java.sql.Time java.sql.Time getTime()
TIMESTAMP java.sql.Timestamp java.sql.Timestamp getTimestamp()
根据java2的规范要求使用Java.sql.Timestamp,这样不会失去精度详见(http://blogger.org.cn/blog/more.asp?name=hongrui&id=7557)。对于oracle数据库比较例外,可以用oracle.sql.TIMESTAMP
这和他的版本也有关系。注意,SQLserver中timestamp 对应的是 DateTime类型。
使用spring的jdbc时,尽可能用Java.sql.Timestamp详见(http://blogger.org.cn/blog/more.asp?name=hongrui&id=9521)。
下面给个例子
public static java.sql.Timestamp getDBSysdate(Connection conn)
throws Exception {
Statement stmt = null;
ResultSet rs = null;
Timestamp sysTime = null;

try {
stmt = conn.createStatement();
rs = stmt.executeQuery("SELECT SYSDATE FROM DUAL");
if (rs.next()) {
sysTime = rs.getTimestamp("SYSDATE");
}
} catch (Exception e) {

} finally {
try {
if (rs != null) {
rs.close();
}
if (stmt != null) {
stmt.close();
}
} catch (Exception e) {

}
}

return sysTime;
}
最好的办法使用long存时间,使用Calendar 处理,就是表示日期时间不直观。
2.字符串转化时间,注意不能判断时间输入是否正确,判断时间输入是否正确,请使用正则。
try
{
String st="2005-13-32 12:00";
java.text.DateFormat df = new SimpleDateFormat("yyyy-MM-dd hh:mm");
Date starttime = df.parse(st);
System.out.println(starttime.toString());
}
catch(Exception ex)
{

}
不要搞混了try-catch的功能。只有程序或系统抛出了异常,try-catch才能捕获 ,得到Wed Feb 01 00:00:00 CST 2006
这样操作是错误的,Timestamp是java.util.Date,会得到java.lang.ClassCastException,你犯了向下转型的错误。

try
{
String st="2005-13-32 12:00";
java.text.DateFormat df = new SimpleDateFormat("yyyy-MM-dd hh:mm");
Timestamp starttime =(Timestamp) df.parse(st);
System.out.println(starttime.toString());
}
catch(Exception ex)
{
ex.printStackTrace();
}
应该使用
try {
String st = "2005-12-2 12:00:00";
Timestamp starttime = Timestamp.valueOf(st);
System.out.println(starttime.toString());
} catch (Exception ex) {
ex.printStackTrace();
}

import java.sql.*;
import java.util.*;

public class CreateTimestamp {
public static void main(String [] args) {

Calendar cal = Calendar.getInstance();

cal.set(Calendar.YEAR, 2000);
cal.set(Calendar.MONTH, Calendar.JANUARY);
cal.set(Calendar.DATE, 1);
cal.set(Calendar.HOUR_OF_DAY, 11);
cal.set(Calendar.MINUTE, 45);
cal.set(Calendar.SECOND, 30);
cal.set(Calendar.MILLISECOND, 0);

long millis = cal.getTime().getTime();
System.out.println("milliseconds in millis = " + millis);
java.sql.Timestamp ts = new java.sql.Timestamp(millis);
System.out.println("Timestamp ts before setting nanos = " + ts);

ts.setNanos(500);
System.out.println("Timestamp ts with nanos set = " + ts);
}
}


下面给出javadoc的方法
1. java.sql.Date.valueOf(java.lang.String)

public static Date valueOf(String s)
Converts a string in JDBC date escape format to a Date value.

Parameters:
s - a String object representing a date in in the format "yyyy-mm-dd"
Returns:
a java.sql.Date object representing the given date
Throws:
IllegalArgumentException - if the date given is not in the JDBC date escape format (yyyy-mm-dd)

2. java.sql.Time.valueOf(java.lang.String)

public static Time valueOf(String s)
Converts a string in JDBC time escape format to a Time value.

Parameters:
s - time in format "hh:mm:ss"
Returns:
a corresponding Time object

3. java.sql.Timestamp.valueOf(java.lang.String)

public static Timestamp valueOf(String s)
Converts a String object in JDBC timestamp escape format to a Timestamp value.

Parameters:
s - timestamp in format yyyy-mm-dd hh:mm:ss.fffffffff
Returns:
corresponding Timestamp value
Throws:
IllegalArgumentException - if the given argument does not have the format yyyy-mm-dd hh:mm:ss.fffffffff

Java 中日期加减:
用GregorianCalendar类就成
GregorianCalendar gc=new GregorianCalendar();
gc.setTime(new Date);
gc.add(field,value);
value为正则往后,为负则往前
field取1加1年,取2加半年,取3加一季度,取4加一周
取5加一天....

没有评论: