2013-04-23 100 views
1

我如何修改1970年以前的公曆日期的變量「時間」。或1970年之前日期的公曆的變量「時間」單位是什麼?公曆1970年前的日曆和日期

我使用hibernate進行對象關係映射。我試圖保存到我的數據庫的數據是日期型公曆日曆。但是,每當日期少於1970年,我的應用程序崩潰。

回答

1

你不能使用壓延類嗎?

public class DatePrint { 
    public static void main(String[] argv) { 
    Calendar c = new GregorianCalendar(1900, 10, 11); 
    System.out.println(c.get(Calendar.DAY_OF_MONTH) + " " 
     + c.get(Calendar.MONTH) + ", " + c.get(Calendar.YEAR) + " " 
     + c.get(Calendar.ERA)); 
    } 
} 
2

大紀元(1970年1月1日),時間戳由負數表示。看看this SO answer來看一個例子。

如果你的應用程序「崩潰」(不管是什麼意思),你需要看它在數據庫中是如何表示的以及它是如何映射的。

0

TL;博士

ZonedDateTime.of( 
    LocalDate.of(1969 , Month.DECEMEBER , 25) , 
    LocalTime.NOON , 
    ZoneId.of("Africa/Tunis") 
).toInstant() 

崩潰?

尚未提供足夠的信息來診斷你的崩潰。

請注意,各種數據庫的日期時間功能差異很大。 SQL標準幾乎沒有涉及日期時間處理的主題,所以很少需要。一些數據庫的支持非常有限。任何認真的面向企業的數據庫都應該能夠輕鬆存儲數百年來在過去以及未來的時刻。

java.time

使用java.time類添加到Java 8和更高版本。這些類型顯然是now supported in Hibernate(我不是用戶)。

在內部,1970-01-01T00:00Z(1970年第一個時刻,UTC)的時刻之後的瞬間表示爲納秒數,一個正數。 之前之前的時刻,負數爲納秒。但你不應該在意。只需按照預期使用java.time類,並且永遠不會看到該計數。

如果你想聖誕節的中午於1969年在新西蘭:

LocalTime lt = LocalTime.NOON ; 
LocalDate ld = LocalDate.of(1969 , Month.DECEMEBER , 25) ; 
ZoneId z = ZoneId.of("Pacific/Auckland") ; 
ZonedDateTime zdt = ZonedDateTime.of(ld , lt , z) ; 

數據庫

使用JDBC 4.2及更高版本,可以直接與數據庫交換這些java.time類型。不需要數字或字符串。舊的java.sql.Timestamp和相關類現在是遺留的,可以被遺忘。

調整你的時刻從它的時區到UTC,提取一個Instant。同一時刻,即時間線上的同一時刻,但通過特定區域人們使用的掛鐘時間鏡頭觀察。

Instant instant = zdt.toInstant() ; 

傳遞給你的數據庫TIMESTAMP WITH TIME ZONE類型的列。

myPreparedStatement.setObject(… , instant) ; 

並檢索。

Instant instant = myResultSet.getObject(… , Instant.class) ; 
ZonedDateTime zdt = instant.atZone(ZoneId.of("America/Montreal")) ; 

關於java.time

java.time框架是建立在Java 8和更高版本。這些類代替了日期時間類legacy,如java.util.Date,Calendar,& SimpleDateFormat

Joda-Time項目,現在在maintenance mode,建議遷移到java.time類。請參閱Oracle Tutorial。並搜索堆棧溢出了很多例子和解釋。規格是JSR 310

從何處獲取java.time類?

ThreeTen-Extra項目與其他類擴展java.time。這個項目是未來可能增加java.time的一個試驗場。您可以在這裏找到一些有用的類,如Interval,YearWeek,YearQuartermore