为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

慕码人8056858 2022-08-17 21:25:59
嘿,伙计们,我使用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 herestart: Thu, 1 Feb 2019 00:00:00 UTC 00:00 pm  End Sun, 31 Mar 2019 23:59:59 UTC 11:59 pmim使用该函数来获取一周和一个月中的时间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 回答

?
白衣染霜花

TA贡献1796条经验 获得超10个赞

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


查看完整回答
反对 回复 2022-08-17
?
拉莫斯之舞

TA贡献1820条经验 获得超10个赞

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日星期一。

我建议你避免上课。该类设计不佳,并且早已过时,因此对于像您这样的不太平凡的日期和时间操作来说,这是一个糟糕的工具。相反,我使用的是java.time,即现代Java日期和时间API。它对你正在做的事情有更好的支持,而且通常也更适合使用。Calendar

您的代码中出了什么问题?

我们并不完全清楚为什么你会得到你得到的结果,因为你没有提供一个完整的例子,因为你的代码的行为取决于时区和区域设置。潜在问题包括:

  • 您得到的一个可能的解释是,您在UTC偏移量+05:30的时区运行代码,例如亚洲/加尔各答或亚洲/科伦坡。在这个时区,您已经开始了新的一天。它与 UTC 时间前一天的 18:30 相同。18:30:00 UTC 6:30 pm

  • 12:47:15 UTC 12:47 pm看起来很奇怪。它可能来自您的常量具有不正确的值。ONE_DAY

  • cal.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 6java.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


查看完整回答
反对 回复 2022-08-17
?
忽然笑

TA贡献1806条经验 获得超5个赞

试试这个:


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;


查看完整回答
反对 回复 2022-08-17
  • 3 回答
  • 0 关注
  • 187 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信