到下周六获得毫秒

时间:2015-04-18 01:22:03

标签: java date datetime milliseconds

我正在开发一个每周活动,但我需要在下周六之前获得毫秒(unix时间戳)。我怎么能这样做?

3 个答案:

答案 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)毫秒。

Joda-Time或java.time

我建议学习如何使用复杂的日期时间库。在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提供三个课程,以各种方式表示时间跨度:

  • Interval(时间线上的一对固定点)
  • Period(若干月,日,小时等)
  • Duration(毫秒)。

示例代码,再次是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());