如何从datepicker获取gmt时间戳?

wnvonmuf  于 2021-07-03  发布在  Java
关注(0)|答案(2)|浏览(433)

我有一个 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);
628mspwn

628mspwn1#

3TENABP公司

我的建议是你跳过过时的课程 Calendar 以及 GregorianCalendar 并开始使用现代的java日期和时间api。和他一起工作更好。即使在什么时候 DatePicker 返回值是为与旧类一起使用而设计的。即使现代的api还没有在很多android手机上实现(这一点将会到来)。
你需要得到3TENABP图书馆。有用的问题:如何在android项目中使用threetenabp。你的代码可以是这样的:

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

2017年9月4日,结果将是 1504483200000 .
从日期选取器的基于0的月份转换为 LocalDate 更人性化的一个月有点奇怪。如果您发现只添加1更简单,那么也可以:

long dps = LocalDate.of(dpStart.getYear(), dpStart.getMonth() + 1, dpStart.getDayOfMonth())
            // …

我已经重命名了您的变量,以符合java编码约定。他们说变量名应该以小写字母开头。
另外,我认为存储时间戳的公认最佳实践是 Instant 你从哪里得到的 toInstant() 或其字符串表示形式(从 toString() )而不是毫秒值。毫秒值对于我们大多数人来说是很难解释的,例如当我们在调试器中看到它们时。 Instant 价值观很容易理解,至少大致上是指什么时候。更好的人类可读格式是 LocalDate ,看起来像 2017-09-04 . 两者的字符串表示形式 Instant 以及 LocalDate 符合iso 8601。

过时的解决方案

如果你肯定不想依赖第三方库,比如threetenabp,即使是暂时的,直到现代的date and time api出现在android上,我相信 Calendar 是(1)确保它使用utc时区(2)清除小时、分钟、秒和毫秒以确保您在午夜获得时间:

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

结果同上。

azpvetkf

azpvetkf2#

public Long timestampFromString(String format,String time){
        // format example "yyyy.MM.dd hh:mm"
        DateFormat formatter = new SimpleDateFormat(format);
        Date date = null;
        try {
            date = formatter.parse(time);
            return date.getTime();
        } catch (ParseException e) {
            e.printStackTrace();
        }
        return null;
    }
    public String stringFromTimestamp(String format,Long time){
        Timestamp timestamp = new Timestamp(time);
        return new SimpleDateFormat(format).format(timestamp);
    }

相关问题