在 00:00:00 am android 中获取一周第一天的开始时间

嘿,伙计们,我使用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

im使用该函数来获取一周和一个月中的时间


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();

    }


慕码人8056858
浏览 188回答 3
3回答

白衣染霜花

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

拉莫斯之舞

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:00Z2019-03-01T00:00:00Z由于您的预期和观察到的输出都提到了UTC,因此我假设您希望使用UTC进行操作。由于星期一是我所在地区一周的第一天,因此我在第一行中得到了3月18日星期一。我建议你避免上课。该类设计不佳,并且早已过时,因此对于像您这样的不太平凡的日期和时间操作来说,这是一个糟糕的工具。相反,我使用的是java.time,即现代Java日期和时间API。它对你正在做的事情有更好的支持,而且通常也更适合使用。Calendar您的代码中出了什么问题?我们并不完全清楚为什么你会得到你得到的结果,因为你没有提供一个完整的例子,因为你的代码的行为取决于时区和区域设置。潜在问题包括:您得到的一个可能的解释是,您在UTC偏移量+05:30的时区运行代码,例如亚洲/加尔各答或亚洲/科伦坡。在这个时区,您已经开始了新的一天。它与 UTC 时间前一天的 18:30 相同。18:30:00 UTC 6:30 pm12:47:15 UTC 12:47 pm看起来很奇怪。它可能来自您的常量具有不正确的值。ONE_DAYcal.set(Calendar.DAY_OF_WEEK, 1);将星期几设置为 1 = 星期日(如果我没记错这些常量,我永远无法确定),但在某些区域设置中,将选择上一个星期日,在其他语言环境中,将选择下一个星期日,而在其他区域设置中,它将随当前星期天而变化。似乎在你忘了设置一天中的小时数。很容易忘记类,你必须单独设置每个字段(很高兴你记得毫秒,许多人忘记了那些)。getMonthDateFirstdateCalendar使用半开间隔。与其希望结束时间,不如将其设置为开放终结点并将其用作开放终结点,也就是说,您的间隔是从开始时间(包括)到结束时间(不含))。因此,这意味着只有当时间点严格早于结束时间时,它才在区间内。Sun, 31 Mar 2019 23:59:59 UTC 11:59 pmMon, 01 Apr 2019 00:00:00 UTC 12:00 am问:我可以在 Android API 级别 20 上使用 java.time 吗?是的,在较旧和较新的Android设备上运行良好。它只需要至少Java 6。java.time在Java 8及更高版本以及新的Android设备上(我被告知,从API级别26开始),新的API是内置的。在Java 6和7中,获得ThreeTen Backport,即新类的向后移植(ThreeTen for JSR 310,其中首次描述了现代API)。在(较旧的)Android上,使用Android版本的ThreeTen Backport。它被称为ThreeTenABP。确保从包和子包中导入日期和时间类。org.threeten.bp

忽然笑

试试这个:Date date = new Date();Calendar cal = Calendar.getInstance();    cal.setTime(date);    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;
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java