【问题标题】:Time conversion milliseconds local time to milliseconds UTC time in android时间转换毫秒本地时间到毫秒UTC时间在android中
【发布时间】:2017-04-25 01:05:47
【问题描述】:

我的设备有 MILLISECONDS 的当前时间。

现在我需要将其转换为 UTC 时区的毫秒数

所以我试过这个,但它没有在毫秒内转换。

public static long localToUTC(long time) {
    try {
        SimpleDateFormat sdf = new SimpleDateFormat("MMM dd, yyyy hh:mm:ss a");
        sdf.setTimeZone(TimeZone.getTimeZone("UTC"));
        Log.e("* UTC : " + time, " - " + sdf.format(new Date(time)));
        Date date = sdf.parse(sdf.format(new Date(time)));
        long timeInMilliseconds = date.getTime();
        Log.e("Millis in UTC", timeInMilliseconds + "" + new SimpleDateFormat("MMM dd, yyyy hh:mm:ss a").format(date));
        return timeInMilliseconds;
    } catch (Exception e) {
        Log.e("Exception", "" + e.getMessage());
    }
    return time;
}

UTC MILLISECONDLOCAL TIME ZONE MILLISECOND

反之亦然

请给我一些建议。

【问题讨论】:

  • 代码对我来说看起来不错。你确定你测试正确吗?也许您可以添加示例输入和预期输出。
  • 谢谢,我已经测试过了,它给了我正确的日期,但是当我从日期对象中取毫秒 long timeInMilliseconds = date.getTime();它给了我一些不准确的价值,这是我需要的

标签: android datetime timezone utc


【解决方案1】:

对于 LOCAL 到 UTC 毫秒,反之亦然

本地到 UTC

public static long localToUTC(long time) {
        try {
            SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy.MM.dd HH:mm:ss");
            Date date = new Date(time);
            dateFormat.setTimeZone(TimeZone.getTimeZone("UTC"));
            String strDate = dateFormat.format(date);
//            System.out.println("Local Millis * " + date.getTime() + "  ---UTC time  " + strDate);//correct

            SimpleDateFormat dateFormatLocal = new SimpleDateFormat("yyyy.MM.dd HH:mm:ss");
            Date utcDate = dateFormatLocal.parse(strDate);
//            System.out.println("UTC Millis * " + utcDate.getTime() + " ------  " + dateFormatLocal.format(utcDate));
            long utcMillis = utcDate.getTime();
            return utcMillis;
        } catch (Exception e) {
            e.printStackTrace();
        }
        return time;
    }

对于 UTC 到本地

public static long utcToLocal(long utcTime) {
        try {
            Time timeFormat = new Time();
            timeFormat.set(utcTime + TimeZone.getDefault().getOffset(utcTime));
            return timeFormat.toMillis(true);
        } catch (Exception e) {
            e.printStackTrace();
        }
        return utcTime;
    }

谢谢,我得到了这个解决方案

【讨论】:

    【解决方案2】:

    关于您的代码的一些观察:

    • 您将格式化程序设置为 UTC,因此您将时间参数解释为 UTC,而不是“本地毫秒”,如下所示:sdf.format(new Date(time)));

    • Date date = sdf.parse(sdf.format(new Date(time))); 没有任何意义。您可以直接编写而无需格式化和解析:Date date = new Date(time);

    我不知道你从哪里得到时间参数。但是您将其解释为“本地毫秒”的说法似乎是基于误解。在处理 UTC 时间线上的全局有效瞬间/时刻 时,在哪里测量瞬间时间是无关紧要的(不考虑时钟故障)。因此,时间参数可能已通过System.currentTimeMillis() 等方式测量为设备时间,但您可以直接将其与任何其他时刻(甚至在其他设备上)进行比较,无需任何转换。

    如果你真的有“本地毫秒”(不应该在专用时区库之外公开处理),那么你需要一个时区偏移量来处理转换,否则它是任意猜测。这种转换的公式是伪代码:

    [utc-time] = [local-time] 减去 [zone offset]

    【讨论】:

    • 谢谢,解决了一些错误。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-12-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多