如何使用Joda-Time将1年转换为秒?

时间:2015-10-23 02:48:35

标签: java jodatime

Years api中有Joda-Time个类,但它没有任何获取秒或milliseconds的方法(或任何将其转换为Duration的方法)。还有一个DateTimeConstants具有有用的常量,但同样没有任何SECONDS_PER_YEAR常量。

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

3 个答案:

答案 0 :(得分:2)

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

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天("spherical"年)和366天(leap year)的秒数。我得到了

31536000
31557600
31622400

这可以概括为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;
    }
}

并测试它(并重现相同的输出)

public static void main(String[] args) {
    int year = 2016;
    System.out.println(YEAR.forYear(year).getSeconds());
    System.out.println(YEAR.SPHERICAL.getSeconds());
    System.out.println(YEAR.forYear(year + 1).getSeconds());
}

但是,正如评论中所指出的,这并不代表leap seconds

答案 1 :(得分:2)

TL;博士

java.util.concurrent.TimeUnit.DAYS.toSeconds(   // Assuming generic 24-hour days.
    Year.of( 2018 ).length()                    // Get number of days in year, either 365 or 366 (leap year).
)                                               // Return a `long`, a count of seconds in year assuming 24-hour days. 
  

31536000

该结果是近似的,假设通用的24小时工作日。有关更准确的数字,请参阅下面的确切的秒数部分。

java.time

现代方法使用 java.time 类。请注意,java.time使用的分辨率为nanoseconds,比Joda-Time的milliseconds更精细。

Joda-Time项目现在位于maintenance mode,团队建议迁移到java.time课程。

通用秒数

如果您想要通用的24小时通用秒数,请使用TimeUnit枚举,Year类和一些数学运算。这种方法忽略了闰秒。

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() ) ;

请参阅此code run live at IdeOne.com

  

秒:31536000 = secondsInYear:31536000

请参阅correct Answer Elliott Frisch

确切的秒数

如果您想要一年中的确切秒数,则可能因时区而异。诸如夏令时(DST)之类的异常或政治家对区域定义的其他变化意味着日期的长度可能不同。它们的长度并不总是24小时。

使用Java的常见实现时,下面的方法会忽略leap seconds。闰秒是不可预测的,因此如果要将它们添加到计算中,则必须查看历史记录。提前,他们只安排了几个月。

LocalDate

LocalDate类表示没有时间且没有时区的仅限日期的值。

时区对于确定日期至关重要。对于任何给定的时刻,日期在全球范围内因地区而异。例如,在Paris France午夜后的几分钟是新的一天,而Montréal Québec中仍然是“昨天”。

continent/region的格式指定proper time zone name,例如America/MontrealAfrica/CasablancaPacific/Auckland。切勿使用诸如ESTIST之类的3-4字母缩写,因为它们不是真正的时区,不是标准化的,甚至不是唯一的(!)。

ZoneId z = ZoneId.of( "America/Montreal" );
LocalDate today = LocalDate.now( z );

Year

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 ) ;

经过时间

我们可以使用Duration类表示未附加到时间轴的时间跨度,分辨率为秒加小数秒。

Duration d = Duration.between( zdtStart , zdtStop ) ;

询问整秒的数量。

long seconds = d.getSeconds() ;

关于java.time

java.time框架内置于Java 8及更高版本中。这些类取代了麻烦的旧legacy日期时间类,例如java.util.DateCalendar和& SimpleDateFormat

现在位于Joda-Timemaintenance mode项目建议迁移到java.time类。

要了解详情,请参阅Oracle Tutorial。并搜索Stack Overflow以获取许多示例和解释。规范是JSR 310

从哪里获取java.time类?

ThreeTen-Extra项目使用其他类扩展java.time。该项目是未来可能添加到java.time的试验场。您可以在此处找到一些有用的课程,例如IntervalYearWeekYearQuartermore

答案 2 :(得分:1)

  

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

没有。

原因是一年中的天数(以及秒数)不是恒定的。

真。

它是365或366 ......取决于你在谈论的是哪一年。

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