2013-04-23 153 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