我想要一个程序,我在其中给出月份和年份,并且该程序应该返回该月的开始和结束时间戳。
例如,如果我将 1 月和 2011 年传递给方法,它将返回 start=1293840000 end = 1296518400
有没有办法做到这一点。
我想要一个程序,我在其中给出月份和年份,并且该程序应该返回该月的开始和结束时间戳。
例如,如果我将 1 月和 2011 年传递给方法,它将返回 start=1293840000 end = 1296518400
有没有办法做到这一点。
使用Joda-Time库,这种工作要容易得多。
您应该指定一个时区,而不是依赖 JVM/主机的默认值。似乎您想要 UTC(无时区偏移),因此您的代码应该明确说明。
此外,获得一天的最后一刻也很棘手。理论上,在第二天开始之前总会有另一个可整除的秒数。当您想要解析为秒(Unix 项)时,两个常见的 Java 库(java.util.Date/.Calendar 和 Joda-Time)使用毫秒,而 Java 8 中的新 java.time 库解析为纳秒。相反,日期时间工作通常使用“半开放”方法完成,其中定义时间跨度,开始是包容性的,结束是排斥性的。所以“一月”从first moment of January 1
到first 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;
你可以做这样的事情
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();
}
使用 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 发生在 4 月。