如何从 DatePicker 获取 GMT 时间戳?

-2 java android timestamp datepicker epoch

我有一个DatePicker元素(“DPstart”)。
我想timestamp在字符串“newStartDate”中保存午夜(以毫秒为单位),而不考虑用户的时区。
我怎样才能做到这一点?

DatePicker DPstart = (DatePicker) findViewById(R.id.datePickerStart);
Calendar calendar = new GregorianCalendar(DPstart.getYear(), DPstart.getMonth(), DPstart.getDayOfMonth());
long DPS = calendar.getTimeInMillis();
String newStartDate = Long.toString(DPS);
Run Code Online (Sandbox Code Playgroud)

Ole*_*.V. 5

三天ABP

我的建议是您跳过过时的类CalendarGregorianCalendar开始使用现代 Java 日期和时间 API。和它一起工作要好得多。即使DatePicker返回值是为与旧类一起使用而设计的。即使现代 API 在很多 Android 手机上都不是原生的(那会来的)。

您将需要得到ThreeTenABP。有用的问题:如何在 Android 项目中使用 ThreeTenABP。那么你的代码可能是这样的:

    long dps = LocalDate.of(dpStart.getYear(), Month.values()[dpStart.getMonth()],
                            dpStart.getDayOfMonth())
            .atStartOfDay(ZoneOffset.UTC)
            .toInstant()
            .toEpochMilli();
    String newStartDate = Long.toString(dps);
Run Code Online (Sandbox Code Playgroud)

选择 2017 年 9 月 4 日,结果将是1504483200000

我将日期选择器的基于 0 的月份转换为LocalDate更人性化的基于 1 的月份的方式有点奇怪。如果您发现仅添加 1 更简单,那也可以:

    long dps = LocalDate.of(dpStart.getYear(), dpStart.getMonth() + 1, dpStart.getDayOfMonth())
            // …
Run Code Online (Sandbox Code Playgroud)

我已重命名您的变量以符合 Java 编码约定。他们说变量名应该以小写字母开头。

顺便说一句,我认为存储时间戳的公认最佳实践是存储Instant您从中获取的内容toInstant()或其字符串表示形式 (from toString()),而不是毫秒值。对于我们大多数人来说,毫秒值很难解释,例如当我们在调试器中看到它们时。Instant值很容易理解,至少大致上它们指的是什么时间。更好的人类可读格式是 的字符串表示形式LocalDate,它看起来像2017-09-04. 两者的字符串表示Instant,并LocalDate符合与ISO 8601。

过时的解决方案

如果您绝对不想依赖像 ThreeTenABP 这样的第三方库,即使在现代日期和时间 API 出现在 Android 之前也是暂时的,我相信解决方案Calendar是 (1) 确保它使用 UTC 时区 (2) 清晰小时、分钟、秒和毫秒,以确保您在午夜获得时间:

    Calendar calendar = new GregorianCalendar(TimeZone.getTimeZone("GMT"));
    calendar.clear();
    calendar.set(dpStart.getYear(), dpStart.getMonth(), dpStart.getDayOfMonth());
Run Code Online (Sandbox Code Playgroud)

结果和上面一样。


归档时间:

查看次数:

1756 次

最近记录:

5 年,6 月 前