我正在开发一个每周活动,但我需要在下周六之前获得毫秒(unix时间戳)。我怎么能这样做?
答案 0 :(得分:5)
1创建日历
Calendar calNow = Calendar.getInstance();
2创建另一个日历,将其设置为午夜并逐日移动,直到您点击星期六
Calendar calNextSat = Calendar.getInstance();
calNextSat.set(Calendar.HOUR, 0);
calNextSat.set(Calendar.MINUTE, 0);
calNextSat.set(Calendar.SECOND, 0);
while(calNextSat.get(Calendar.DAY_OF_WEEK) != Calendar.SATURDAY){
calNextSat.add(Calendar.DATE, 1);
}
System.out.println(calNextSat.getTimeInMillis() - calNow.getTimeInMillis());
处理方案,如果它已经是星期六,你会得到< = 0结果
答案 1 :(得分:3)
我正在开发一个每周活动
使用毫秒进行此类日期时间跟踪可能会让您误入歧途。例如,由于夏令时(DST)和其他异常,一天并不总是24小时,因此一周并不总是((1000L * 60 * 60 * 24)* 7)毫秒。
我建议学习如何使用复杂的日期时间库。在Java中,这意味着:
时区对于确定日期和星期几至关重要。使用proper time zone names,绝不使用3或4个字母代码。
以下是使用Joda-Time 2.7的示例代码。
获取您想要/期望的时区。如果使用UTC,请使用常量DateTimeZone.UTC
。
DateTimeZone zone = DateTimeZone.forID( "America/Montreal" );
获取所需的日期时间值。我在这里使用当前时刻。
DateTime dateTime = DateTime.now( zone );
指定您想要的未来星期几。请注意,Joda-Time在一周的第一天使用明智的#1,而不是在java.util.Calendar中找到从零开始的计数。根据国际规范和标准(不是美国常见的星期日),每周的第一天是星期一。
int dayOfWeek = DateTimeConstants.SATURDAY;
withDayOfWeek
命令可能会及时返回。因此,我们使用ternary operator (?:
)确保我们根据需要添加一周,以便及时前进。
DateTime future = ( dateTime.getDayOfWeek() < dayOfWeek )
? dateTime.withDayOfWeek( dayOfWeek )
: dateTime.plusWeeks( 1 ).withDayOfWeek( dayOfWeek );
您可能希望将时间调整为当天的第一时刻,以强调对当天的关注,而不是当天的特定时刻。
future = future.withTimeAtStartOfDay(); // Adjust time-of-day to first moment of the day to stress the focus on the entire day rather than a specific moment within the day. Or use `LocalDate` class.
转储到控制台。
System.out.println( "Next day # " + dayOfWeek + " after " + dateTime + " is " + future );
运行时。
Next day # 6 after 2015-04-18T16:03:36.146-04:00 is 2015-04-25T00:00:00.000-04:00
上面的代码为我们提供了未来所需的时间点(下周六)。
如果您真正想要的是从现在开始到之后的毫秒数,则以毫秒为单位减去每个内部计数 - 来自epoch。在跟踪时间为毫秒时,请注意使用64位long
而不是32位int
。
long elapsedMilliseconds = ( future.getMillis() - dateTime.getMillis() );
请注意,如果您在java.time而不是Joda-Time中执行此工作,请注意内部java.time使用nanoseconds而不是milliseconds。我记得你可以找到毫秒级的方法。或者将纳秒减去一百万(是的,百万而不是千万,因为microseconds介于两者之间。
您可能希望更智能地表示从现在到现在的时间跨度。 Joad-Time提供三个课程,以各种方式表示时间跨度:
示例代码,再次是Joda-Time 2.7。
Interval interval = new Interval( dateTime , future );
Period period = interval.toPeriod();
转储到控制台。
System.out.println( "interval: " + interval );
System.out.println( "period: " + period );
跑步时。
interval: 2015-04-18T16:17:45.109-04:00/2015-04-25T00:00:00.000-04:00
period: P6DT7H42M14.891S
请注意默认情况下用于Period值的String表示格式。该格式是标准格式,是ISO 8601的一部分,在其术语中称为duration
。该格式为PnYnMnDTnHnMnS
,其中P
标记开头,T
将日期部分与时间部分分开。
Joda-Time和java.time在解析和生成日期时间值的字符串表示时都使用ISO 8601作为默认值。
答案 2 :(得分:2)
我会使用Calendar
来获取当周的当天。你可以减去它,
public static int daysUntilSaturday(Date d) {
Calendar cal = Calendar.getInstance();
cal.setTime(d);
return 7 - cal.get(Calendar.DAY_OF_WEEK);
}
然后您可以执行简单算术,如
/*
* 1000 milliseconds in a second, 60 seconds in a minute, 60 minutes in
* an hour, 24 hours in a day.
*/
final long millisecondsPerDay = 1000L * 60 * 60 * 24;
System.out.println((daysUntilSaturday(new Date()) * millisecondsPerDay)
+ System.currentTimeMillis());