String “2014-11-11” 转换成 timestamp ”2014-11-11“
```public static Timestamp getTimestamp(String time){
Timestamp ts = new Timestamp(System.currentTimeMillis());
try {
ts = Timestamp.valueOf(time);
System.out.println(ts);
} catch (Exception e) {
e.printStackTrace();
logger.error("String转timeStamp出错");
}
return ts;
}
``
这样转换报错 说timeStamp的格式必须是2013-11-11 00:00:00这种的
如果你很确定要把string
转成Timestamp
的话,可以用SimpleDateFormat先转换一下加上时间,或直接在string
中加上默认的时间string + " 00:00:00"
如果你也不是很必须的用Timestamp
做转换的话,请用Date,SimpleDateFormat
即可。
Timestamp
是UTC格式的日期,啥叫UTC?请搜索一下看看。如果没有时间,怎么体现出UTC?
先把String转成Date再转Timestamp,使用joda可以让转换更简单。
import org.joda.time.DateTime;
import java.sql.Timestamp;
public class Q1010000002719435 {
public static void main(String[] args) {
String timeStampString = "2014-11-11";
DateTime dateTime = DateTime.parse(timeStampString);
Timestamp timestamp = new Timestamp(dateTime.getMillis());
System.out.println(timestamp);
}
}
public static Timestamp valueOf(String s) {
final int YEAR_LENGTH = 4;
final int MONTH_LENGTH = 2;
final int DAY_LENGTH = 2;
final int MAX_MONTH = 12;
final int MAX_DAY = 31;
String date_s;
String time_s;
String nanos_s;
int year = 0;
int month = 0;
int day = 0;
int hour;
int minute;
int second;
int a_nanos = 0;
int firstDash;
int secondDash;
int dividingSpace;
int firstColon = 0;
int secondColon = 0;
int period = 0;
String formatError = "Timestamp format must be yyyy-mm-dd hh:mm:ss[.fffffffff]";
String zeros = "000000000";
String delimiterDate = "-";
String delimiterTime = ":";
if (s == null) throw new java.lang.IllegalArgumentException("null string");
// Split the string into date and time components
s = s.trim();
dividingSpace = s.indexOf(' ');
if (dividingSpace > 0) {
date_s = s.substring(0,dividingSpace);
time_s = s.substring(dividingSpace+1);
} else {
throw new java.lang.IllegalArgumentException(formatError);
}
// Parse the date
firstDash = date_s.indexOf('-');
secondDash = date_s.indexOf('-', firstDash+1);
// Parse the time
if (time_s == null)
throw new java.lang.IllegalArgumentException(formatError);
firstColon = time_s.indexOf(':');
secondColon = time_s.indexOf(':', firstColon+1);
period = time_s.indexOf('.', secondColon+1);
// Convert the date
boolean parsedDate = false;
if ((firstDash > 0) && (secondDash > 0) && (secondDash < date_s.length() - 1)) {
String yyyy = date_s.substring(0, firstDash);
String mm = date_s.substring(firstDash + 1, secondDash);
String dd = date_s.substring(secondDash + 1);
if (yyyy.length() == YEAR_LENGTH &&
(mm.length() >= 1 && mm.length() <= MONTH_LENGTH) &&
(dd.length() >= 1 && dd.length() <= DAY_LENGTH)) {
year = Integer.parseInt(yyyy);
month = Integer.parseInt(mm);
day = Integer.parseInt(dd);
if ((month >= 1 && month <= MAX_MONTH) && (day >= 1 && day <= MAX_DAY)) {
parsedDate = true;
}
}
}
if (! parsedDate) {
throw new java.lang.IllegalArgumentException(formatError);
}
// Convert the time; default missing nanos
if ((firstColon > 0) & (secondColon > 0) &
(secondColon < time_s.length()-1)) {
hour = Integer.parseInt(time_s.substring(0, firstColon));
minute =
Integer.parseInt(time_s.substring(firstColon+1, secondColon));
if ((period > 0) & (period < time_s.length()-1)) {
second =
Integer.parseInt(time_s.substring(secondColon+1, period));
nanos_s = time_s.substring(period+1);
if (nanos_s.length() > 9)
throw new java.lang.IllegalArgumentException(formatError);
if (!Character.isDigit(nanos_s.charAt(0)))
throw new java.lang.IllegalArgumentException(formatError);
nanos_s = nanos_s + zeros.substring(0,9-nanos_s.length());
a_nanos = Integer.parseInt(nanos_s);
} else if (period > 0) {
throw new java.lang.IllegalArgumentException(formatError);
} else {
second = Integer.parseInt(time_s.substring(secondColon+1));
}
} else {
throw new java.lang.IllegalArgumentException(formatError);
}
return new Timestamp(year - 1900, month - 1, day, hour, minute, second, a_nanos);
}
源码解析的时候,代码是按照yyyy-mm-dd hh:mm:ss[.fffffffff]
这种格式去解析的。可以从几个indexOf
的调用可以看出来
试试用SimpleDateFormat 的parse方法,先将string转为Date,然后再从Date转为Timestamp就方便了。
还有希望后的HH:mm:ss全部为0,最好补全,不然系统会默认用当前的hh mm ss哦。
当然如果补全了,是否可以直接用你说的Timestamp.valueOf,呵呵!