java中的开始和结束时间戳

时间:2014-05-08 09:11:24

标签: java datetime unix-timestamp java-time

我想要一个程序,其中我给出了月份和年份,程序应该返回月份的开始和结束时间戳。

例如,如果我将1月和2011年传递给该方法,它将返回 启动= 1293840000 结束= 1296518400

有没有办法做到这一点。

4 个答案:

答案 0 :(得分:3)

约达时间

使用Joda-Time库,这种工作要容易得多。

时区

您应该指定时区,而不是依赖于JVM /主机的默认值。似乎你想要UTC(没有时区偏移),所以你的代码应该明确说明。

半开

此外,获得一天中的最后一刻也很棘手。从理论上讲,在第二天开始之前总会有另一个可分的部分。当您想要解析为秒(Unix项)时,两个常见的Java库(java.util.Date/.Calendar和Joda-Time)使用毫秒,Java 8中的新java.time库解析为纳秒。相反,日期时间工作通常使用“半开”方法完成,其中定义了一段时间,开头为包含,结尾为独占 。因此,“1月”从first moment of January 1first moment of February 1

实施例

以下是Joda-Time 2.3中的一些示例代码。

DateTimeZone timeZone = DateTimeZone.UTC;
DateTime start = new DateTime( 2011, DateTimeConstants.JANUARY, 1, 0, 0, 0, timeZone).withTimeAtStartOfDay();
DateTime stop = start.plusMonths( 1 );

您可能会发现Interval课对相关工作很有意思。

Interval january2011 = new Interval( start, stop ); 

转换为秒,从毫秒开始。

long secondsStart = start.getMillis()/1000L;
long secondsStop = stop.getMillis()/1000L;

答案 1 :(得分:2)

你可以做这样的事情

long startDate;
long endDate;

private void calculateMonthStartAndEndTime(int month, int year){
//create the first date of month
Calendar mycal = new GregorianCalendar(year,month, 1);
startDate = mycal.getTimeInMillis();

// Get the number of days in that month which actually gives the last date.
int lastDate = mycal.getActualMaximum(Calendar.DAY_OF_MONTH);
mycal = new GregorianCalendar(year, month, lastDate);
endDate = mycal.getTimeInMillis();
}

答案 2 :(得分:1)

答案 3 :(得分:0)

使用Java 8答案进行更新

(Java 8包含一个基于JodaTime的新时间库):

    ZoneId timeZone = ZoneId.of("US/Eastern");
    //ZoneId timeZone = ZoneOffset.UTC;

    LocalDate march1985 = LocalDate.of(2017, Month.MARCH, 1);
    long beginningOfMarch = march1985.atStartOfDay(timeZone)
            .toInstant()
            .toEpochMilli();

    LocalDate april1985 = march1985.plus(1, ChronoUnit.MONTHS);
    long endOfMarch = april1985.atStartOfDay(timeZone)
            .toInstant()
            .toEpochMilli();

时区

"月初"是时区的函数,所以在这种情况下,我已经展示了如何在东部时间这样做。这些 java.time 类会自动处理DST,因此,例如,如果您执行2017年而不是1985年,您会发现差异是743小时而不是744小时,因为在1985年DST发生在四月。