在Android的00:00:00获取星期的第一天的开始时间

时间:2019-03-19 13:35:56

标签: java android time

嘿,我正在使用android时间获取我的健康数据,我正确地获得了第一个星期和一个月的日期 但我没有一天的开始时间我就得到这样的输出

start: Thu, 1 Feb 2019 18:30:00 UTC 6:30 pm  EndSun, 31 Mar 2019 12:47:15 UTC 12:47 pm

我想在那里

enter code here
start: Thu, 1 Feb 2019 00:00:00 UTC 00:00 pm  End Sun, 31 Mar 2019 23:59:59 UTC 11:59 pm

使用该功能获取星期和月份的时间

public static long getStartTimeOfWeek() {
        Calendar cal = Calendar.getInstance();
        cal.set(Calendar.HOUR_OF_DAY, 0);
        cal.set(Calendar.MINUTE, 0);
        cal.set(Calendar.SECOND, 0);
        cal.set(Calendar.MILLISECOND, 0);
        cal.set(Calendar.DAY_OF_WEEK, 1);

        return  cal.getTimeInMillis()+ ONE_DAY;
    }

一个月:

public static long getMonthDateFirstdate(){
        Calendar cal = Calendar.getInstance();
        cal.clear(Calendar.MINUTE);
        cal.clear(Calendar.SECOND);
        cal.clear(Calendar.MILLISECOND);
        cal.set(Calendar.DATE,cal.getActualMinimum(Calendar.DAY_OF_MONTH));
        return cal.getTimeInMillis();
    }

3 个答案:

答案 0 :(得分:0)

尝试一下:

drwxrwxrwx    2 root     root          4096 Mar 19 14:42 mytest

答案 1 :(得分:0)

尝试SimpleDateFormat sdf = new SimpleDateFormat(“ dd-MM-yyyy hh:mm:ss”)

答案 2 :(得分:0)

java.time

我建议以下两种方法的实现。

public static long getStartTimeOfWeek() {
    WeekFields wf = WeekFields.of(Locale.getDefault());
    return LocalDate.now(ZoneOffset.UTC)
            .with(wf.dayOfWeek(), 1)
            .atStartOfDay(ZoneOffset.UTC)
            .toInstant()
            .toEpochMilli();
}

public static long getMonthDateFirstdate(){
    return YearMonth.now(ZoneOffset.UTC)
            .atDay(1)
            .atStartOfDay(ZoneOffset.UTC)
            .toInstant()
            .toEpochMilli();
}

尝试一下:

    System.out.println(Instant.ofEpochMilli(getStartTimeOfWeek()));
    System.out.println(Instant.ofEpochMilli(getMonthDateFirstdate()));

当我刚在计算机上运行这两行时,我得到了:

2019-03-18T00:00:00Z
2019-03-01T00:00:00Z

由于您的预期输出和观察到的输出都提到了UTC,因此我假设您希望使用UTC进行操作。而且由于星期一是我所在地区的一周的第一天,因此第一行是3月18日,星期一。

我建议您避免使用Calendar类。该类的设计很差,而且已经过时,因此对于像您这样的琐碎的日期和时间操作来说,它是一个糟糕的工具。相反,我使用的是java.time,这是现代的Java日期和时间API。它为您的工作提供了更好的支持,并且通常也更易于使用。

您的代码出了什么问题?

由于您没有提供完整的示例,并且代码的行为取决于时区和语言环境,因此我们还不清楚为什么会得到结果。潜在的问题包括:

  • 获得18:30:00 UTC 6:30 pm的可能原因是您在UTC偏移+05:30的时区中运行了代码,例如Asia / Kolkata或Asia / Colombo。您已在该时区开始工作。与世界标准时间前一天的18:30处于同一时间点。
  • 12:47:15 UTC 12:47 pm看起来很奇怪。它可能来自常量ONE_DAY的值不正确。
  • cal.set(Calendar.DAY_OF_WEEK, 1);将星期几设置为1 =星期日(如果我正确地记住了这些常量,我不确定),但是在某些语言环境中将选择前一个星期日,在其他语言环境中将选择下一个星期日,在其他地区,则根据当前星期几而有所不同。
  • 似乎您在getMonthDateFirstdate中忘记设置一天中的时间。通过Calendar类,您很容易忘记,您必须在其中单独设置每个字段(记住的时间很毫秒,很多人忘记了)。
  • 使用半开间隔。建议不要将结尾设置为Sun, 31 Mar 2019 23:59:59 UTC 11:59 pm,而建议将其设置为Mon, 01 Apr 2019 00:00:00 UTC 12:00 am并将其用作开放端点,即,您的间隔是从开始时间 到结束时间专有。因此,这意味着某个时间点只有在结束时间严格之前,才在时间间隔内。

问题:我可以在Android API 20级上使用java.time吗?

是的,java.time在较新的Android设备上都能很好地工作。它只需要至少 Java 6

  • 在Java 8和更高版本以及新的Android设备上(有人告诉我API级别为26),新的API是内置的。
  • 在Java 6和7中,获得了ThreeTen反向端口,即新类的反向端口(JSR 310的ThreeTen,首次描述了现代API)。
  • 在(较旧的)Android上,使用ThreeTen Backport的Android版本。叫做ThreeTenABP。确保从包org.threeten.bp和子包中导入日期和时间类。

链接