代码之家  ›  专栏  ›  技术社区  ›  shazin

Joda DateTime发布年份

  •  0
  • shazin  · 技术社区  · 8 年前

    当我运行以下代码段时:

    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年我不知道为什么Joda DateTime 给出年份为1879年。任何帮助都将不胜感激。

    1 回复  |  直到 8 年前
        1
  •  1
  •   Community Mohan Dere    5 年前

    此代码:

    Date aDate1880 = new Date(-20, 0, 1);
    

    创建 Date 相当于1880年1月1日。由于没有提供时间字段,因此在JVM默认时区将其设置为午夜。在我的例子中,它是“美国/圣保罗”,所以下面的结果在你的例子中可能不同,但它可以解释到底发生了什么。在我的情况下,创建日期为:

    1月1日星期四00:00:00 BRT 1880

    (1880年1月1日午夜,美国/圣保罗时区-BRT表示“巴西时间”)

    使命感 aDate1880.getTime() 返回值 -2840130000000 ,在UTC中对应于 1880-01-01T03:00:00Z .

    转换为时 DateTime ,它使用joda时间内部时区数据,在我的例子中 日期时间 是:

    1879 -12-31T23:53:32.000-03:06:28

    这是因为在1900年之前,许多国家没有使用现行的时区规则,大多数城市都有自己的当地时间。大多数偏移量是基于经度计算的,这就是为什么它会有这样奇怪的结果 "-03:06:28" .

    可能你的时区也有类似的问题。

    注: new DateTime(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();
    
    推荐文章