Java 如何使用Joda时间将1年转换为秒?

Java 如何使用Joda时间将1年转换为秒?,java,jodatime,Java,Jodatime,api中有一个类,但它没有任何获取秒数或秒数的方法(或任何将其转换为秒数的方法)。此外,还有一个具有有用常数的变量,但同样没有任何SECONDS\u/年常数 那么,如何用joda时间将1年转换为秒呢 什么是飞跃?:)如果你问一年中的天数,应该是365天。只有标准的分钟、小时和天。一年中应该是60*60*24*365秒,但有常数吗 不,没有 原因是一年中的天数(因此秒数)不是恒定的 真的 它不是365就是366。。。取决于你谈论的是哪一年 那么为什么他们没有为365天和366天的情况定义两个常数呢

api中有一个类,但它没有任何获取秒数或秒数的方法(或任何将其转换为秒数的方法)。此外,还有一个具有有用常数的变量,但同样没有任何
SECONDS\u/年
常数

那么,如何用joda时间将1年转换为秒呢

什么是飞跃?:)如果你问一年中的天数,应该是365天。只有标准的分钟、小时和天。一年中应该是60*60*24*365秒,但有常数吗

不,没有

原因是一年中的天数(因此秒数)不是恒定的

真的

它不是365就是366。。。取决于你谈论的是哪一年


那么为什么他们没有为365天和366天的情况定义两个常数呢?我猜是因为他们认为这是有害的。(例如,这可能导致人们编写的应用程序假设每年有365天……并错误地计算了时间间隔。)

一年中的秒数没有常数,因为您必须首先确定一年中的天数常数。使用(Java5+)您可以使用

System.out.println(TimeUnit.SECONDS.convert(365, TimeUnit.DAYS));
System.out.println(TimeUnit.SECONDS.convert(365, TimeUnit.DAYS)
        + TimeUnit.SECONDS.convert(6, TimeUnit.HOURS));
System.out.println(TimeUnit.SECONDS.convert(366, TimeUnit.DAYS));
获取365天(一年)、365.25天(一年)和366天(一年)的秒数。我明白了

这可以概括为
enum

public enum YEAR {
    TYPICAL(TimeUnit.SECONDS.convert(365, TimeUnit.DAYS)), //
    SPHERICAL(TimeUnit.SECONDS.convert(365, TimeUnit.DAYS) //
        + TimeUnit.SECONDS.convert(6, TimeUnit.HOURS)), //
    LEAP(TimeUnit.SECONDS.convert(366, TimeUnit.DAYS));
    YEAR(long seconds) {
        this.seconds = seconds;
    }

    long seconds;

    public long getSeconds() {
        return seconds;
    }

    public static YEAR forYear(int year) {
        if ((year % 4 == 0 && year % 100 != 0) || year % 400 == 0) {
            return LEAP;
        }
        return TYPICAL;
    }
}
并对其进行测试(并复制相同的输出)

然而,正如评论中指出的,这并不能解释tl;博士 31536000

这个结果是近似的,假设是一般的24小时工作日。有关更准确的数字,请参阅下面的精确秒数部分

java.time 现代方法使用java.time类。请注意,java.time使用的分辨率为,比Joda time的分辨率高得多

该项目现在正在进行中,团队建议迁移到类

一般秒数 如果您想要一个假定为一般24小时工作日的一般秒数,请使用enum、class和一点数学。这种方法忽略了闰秒

long secondsPerGenericDay = TimeUnit.DAYS.toSeconds( 1 ) ;  // Assuming 24-hour days.
long days = Year.of( 2018 ).length() ;  // Either 365 or 366 depending on leap year.
long seconds = ( days * secondsPerGenericDay ) ;
……或者

long secondsInYear = TimeUnit.DAYS.toSeconds( Year.of( 2018 ).length() ) ;
看这个

秒数:31536000=秒年数:31536000

另见

精确秒数 如果你想要一年中精确的秒数,这可能会因时区而异。异常情况,如夏令时(DST)或政客对分区定义的其他更改,意味着天数可能会有所不同。它们的长度并不总是完全24小时

当使用Java的通用实现时,下面的方法确实会忽略。闰秒是不可预测的,所以如果要将它们添加到计算中,必须查看历史记录。事先,他们只安排了几个月

LocalDate
该类表示一个仅限日期的值,不包含一天中的时间和时区

时区对于确定日期至关重要。在任何一个特定的时刻,世界各地的日期都因地区而异。例如,中午夜后几分钟是新的一天,而中仍然是“昨天”

大陆/地区
的格式指定,例如,或
太平洋/奥克兰
。切勿使用3-4个字母的缩写,如
EST
IST
,因为它们不是真正的时区,也不是标准化的,甚至不是唯一的(!)

年份
Year
课程可以提供帮助

Year y = Year.now( z ) ;

LocalDate start = y.atDay( 1 ) ;
LocalDate stop = start.plusYears( 1 ) ;
一天中的第一刻 我们需要特定的时刻来计算秒数。所以我们需要每个约会的第一刻

让java.time确定第一个时刻。DST等异常意味着一天可能在00:00以外的时间开始

ZonedDateTime zdtStart = start.atStartOfDay( z ) ;
ZonedDateTime zdtStop = stop.atStartOfDay( z ) ;
经过的时间 我们可以使用该类以秒加分数秒的分辨率表示与时间线无关的时间跨度

询问整秒数

long seconds = d.getSeconds() ;

关于java.time 该框架内置于Java8及更高版本中。这些类取代了麻烦的旧日期时间类,例如,&

该项目现已启动,建议迁移到类

要了解更多信息,请参阅。并搜索堆栈溢出以获得许多示例和解释。规格是

从哪里获得java.time类

  • ,及以后
    • 内置的
    • 标准JavaAPI的一部分,带有捆绑实现
    • Java9添加了一些次要功能和修复
    • 大部分java.time功能都在中向后移植到Java6和Java7
    • 该项目专门为Android采用了ThreeTen Backport(如上所述)

该项目使用其他类扩展了java.time。这个项目是java.time将来可能添加的一个试验场。您可以在这里找到一些有用的类,如、、和。

第一个问题,这是闰年吗?什么是闰年?:)如果你问一年中的天数,应该是365天。只有标准的分钟、小时和天。它应该是一年中的
60*60*24*365
秒,但是有一个常数吗?是的。问题是您想要的是典型年份的秒数,还是给定年份的秒数。没有常数的(明显的)原因是。。。一年中的秒数不是恒定的。类似的论点适用于年->持续时间。@Cherry:-A。这就是为什么你每四年有29个2月:)并且每隔一段时间会增加一秒来与原子时同步。也因为闰秒!如果它们与您相关。
ZoneId z = ZoneId.of( "America/Montreal" );
LocalDate today = LocalDate.now( z );
Year y = Year.now( z ) ;

LocalDate start = y.atDay( 1 ) ;
LocalDate stop = start.plusYears( 1 ) ;
ZonedDateTime zdtStart = start.atStartOfDay( z ) ;
ZonedDateTime zdtStop = stop.atStartOfDay( z ) ;
Duration d = Duration.between( zdtStart , zdtStop ) ;
long seconds = d.getSeconds() ;