-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)
我的建议是您跳过过时的类Calendar并GregorianCalendar开始使用现代 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 次 |
| 最近记录: |