Java Joda DateTime发行年份
当我运行以下代码段时:Java Joda DateTime发行年份,java,date,timestamp,jodatime,date-conversion,Java,Date,Timestamp,Jodatime,Date Conversion,当我运行以下代码段时: import org.joda.time.DateTime; import org.joda.time.DateTimeZone; import java.sql.Timestamp; import java.util.Calendar; import java.util.Date; public class TimestampTest { public static void main(String... args) throws Exception {
import org.joda.time.DateTime;
import org.joda.time.DateTimeZone;
import java.sql.Timestamp;
import java.util.Calendar;
import java.util.Date;
public class TimestampTest {
public static void main(String... args) throws Exception {
Date aDate1880 = new Date(-20, 0, 1);
Timestamp timestamp = new Timestamp(aDate1880.getTime());
DateTime dateTime = new DateTime(timestamp).withZoneRetainFields(DateTimeZone.getDefault());
System.out.println(dateTime.year().get());
Calendar calendar = Calendar.getInstance();
calendar.setTime(timestamp);
System.out.println(calendar.get(Calendar.YEAR));
}
}
我得到以下输出:
1879年1880年 由于
aDate1880
实际上代表的是1880年,我不知道为什么JodaDateTime
给出的年份是1879年。任何帮助都将不胜感激。此代码:
Date aDate1880 = new Date(-20, 0, 1);
创建一个相当于1880年1月1日的日期。由于未提供时间字段,因此在JVM默认时区将其设置为午夜。在我的例子中,它是“美国/圣保罗”,所以下面的结果在你的例子中可能会有所不同——但它可以解释到底发生了什么。就我而言,创建日期为:
星期四一月一日00:00:00快速公交1880
(1880年1月1日美国/圣保罗时区午夜——BRT的意思是“巴西时间”)
调用aDate1880.getTime()
返回值-2840130000000
,该值在UTC中对应于1880-01-01T03:00:00Z
转换为DateTime
时,它使用joda time内部时区数据,在我的例子中,DateTime
是:
1879-12-31T23:53:32.000-03:06:28
这是因为在1900年之前,许多国家没有使用现行的时区规则,大多数城市都有自己的当地时间。大多数偏移量是基于经度计算的,这就是为什么它会有如此奇怪的结果,比如“-03:06:28”
也许你的时区也有类似的问题
注意:newdatetime(timestamp)
已使用默认时区,因此对withZoneRetainFiels
的调用是多余的:
DateTime dateTime = new DateTime(timestamp);
// this prints "true"
System.out.println(dateTime.equals(dateTime.withZoneRetainFields(DateTimeZone.getDefault())));
要创建所需的日期,只能使用Joda时间类:
// January 1st 1880, at midnight in JVM default timezone
DateTime d = new LocalDate(1880, 1, 1).toDateTimeAtStartOfDay();
aDate1980
是1880年(1月1日)Date(int year,int month,int Date)
的第一个参数是“年份减去1900”。从JDK 1.1开始,它也被弃用。当“切换时区”(默认值?…保留所有其他值)时,1879年很容易发生……我很确定它大约在12月31日左右;)@xerx593即使我不使用。WithZoneReainFields(DateTimeZone.getDefault())
它仍然提供1879nice…然后是系统.out.println(dateTime.toString())代码>提供更多信息…谷歌查询将导致