我有Eg: 2014-04-22 08:22:41
的日期,我必须在格林威治标准时间5时区({1}}以秒为单位显示日期。
我有以下代码:
12/31/1969 19:00:00
输出为:第二个表示是1398135161
但是当我从Sybase数据库获得相同的值时,我得到了值:
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.TimeZone;
public class samp {
public static void main(String args[]) {
Calendar cal = Calendar.getInstance(TimeZone.getTimeZone("GMT-5:00"));
long temp;
Date tempDate = null;
temp = 0L;
cal.clear();
try {
tempDate = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").parse("2014-04-22 08:22:41");
} catch (Exception e) {
}
cal.setTime(tempDate);
temp = cal.getTimeInMillis() / 1000L;
cal.clear();
System.out.println("Second representation is " + (int) temp);
}
}
为什么java结果和数据库值之间存在差异。
java代码中是否存在某些问题。
请澄清。
答案 0 :(得分:0)
您可以在oracle文档站点找到: http://docs.oracle.com/javase/6/docs/api/java/util/Calendar.html#getTimeInMillis()
getTimeInMillis
以UTC返回时间
您可以使用以下方法将该值调整为您的时区:
cal.getTimeZone().getOffset(UTCmilliseconds)
其中(如http://docs.oracle.com/javase/6/docs/api/java/util/TimeZone.html#getOffset(long)所述)返回您需要添加到UTC时间的毫秒数,以便以毫秒为单位获取本地时间。
由您的区域调整时间给出:
cal.setTime(tempDate);
temp = cal.getTimeInMillis();
temp = (temp + (long)(cal.getTimeZone().getOffset(temp)))/ 1000L;
答案 1 :(得分:0)
他们正在使用不同的时区
您的数据库正在使用您设置的时区,但在您的日历中,当您获得毫秒时,您没有使用相同的时区。
1398135161 * 1000可以等于毫秒
Date (America/New_York) Monday, April 21, 2014 10:52:41 PM EDT
Date (GMT) Tuesday, April 22, 2014 2:52:41 AM GMT
这都与时区有关。
有些网站可以帮助您解决疑问 http://www.ruddwire.com/handy-code/date-to-millisecond-calculators/#.U1dtG-bqfCc http://www.fileformat.info/tip/java/date2millis.htm
答案 2 :(得分:0)
您应该考虑调整日期时间值而不是时代。
由于夏令时和其他异常,您可能应该使用正确的时区名称,而不是特定的偏移号码。除非您绝对确定您的日期值总是按特定偏移量进行调整。
你应该使用一个像样的库而不是众所周知的java.util.Date和.Calendar类。这意味着Joda-Time或Java 8中的新java.time包。
以下是Joda-Time中的示例代码。
String inputRaw = "2014-01-02 12:34:56";
String input = inputRaw.replace( " ", "T" );
DateTimeZone timeZone = DateTimeZone.forID( "America/Detroit" );
DateTime dateTime = new DateTime( input, timeZone );
long millis = dateTime.getMillis();
Long seconds = ( millis / 1000L );