服务器时区java转换

时间:2011-09-19 09:56:44

标签: java android date timezone

好的,所以我几乎尝试了一切。我打赌这是非常简单的事情,但我似乎无法掌握它。

服务器发给我时间,这是时代。但是,当我将它放入日期对象时,它似乎会自动选择时区,并且它会在服务器时间增加+3。因此,如果gmt时间是00.00,则表示其为03.00。

我还需要添加自己的时区。假设纪元时间再次为00.00,我添加时区后应该读取10.00。

任何帮助将不胜感激。谢谢

2 个答案:

答案 0 :(得分:1)

java.time

java.util 日期时间 API 及其格式化 API SimpleDateFormat 已过时且容易出错。建议完全停止使用它们并切换到 modern Date-Time API*

另外,下面引用的是来自 home page of Joda-Time 的通知:

<块引用>

请注意,从 Java SE 8 开始,要求用户迁移到 java.time (JSR-310) - JDK 的核心部分,取代了该项目。

使用 java.time(现代日期时间 API)的解决方案:

import java.time.Instant;
import java.time.ZoneId;
import java.time.ZonedDateTime;

public class Main {
    public static void main(String[] args) {
        long millis = 1316391494L;

        Instant instant = Instant.ofEpochMilli(millis);
        System.out.println(instant);

        // The same instant at a specific timezone
        ZonedDateTime zdt = instant.atZone(ZoneId.of("Australia/Brisbane"));
        System.out.println(zdt);
    }
}

输出:

1970-01-16T05:39:51.494Z
1970-01-16T15:39:51.494+10:00[Australia/Brisbane]

ONLINE DEMO

Trail: Date Time 了解有关现代 Date-Time API 的更多信息。

您的代码出了什么问题?

java.util.Date 对象仅表示时间轴上的一个瞬间 — 自 UNIX 时代(格林威治标准时间 1970 年 1 月 1 日 00:00:00)以来毫秒数的包装器。由于它不保存任何时区信息,它的 toString 函数应用 JVM 的时区返回一个 String 格式,EEE MMM dd HH:mm:ss zzz yyyy,从这个 毫秒值。要以不同的格式和时区获取 String 对象的 java.util.Date 表示,您需要将 SimpleDateFormat 与所需的格式和适用的时区一起使用,例如

import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Locale;
import java.util.TimeZone;

public class Main {
    public static void main(String[] args) {
        long millis = 1316391494L;
        Date date = new Date(millis);

        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSXXX[zzzz]", Locale.ENGLISH);

        sdf.setTimeZone(TimeZone.getTimeZone("Etc/UTC"));
        String strDateUtc = sdf.format(date);
        System.out.println(strDateUtc);

        sdf.setTimeZone(TimeZone.getTimeZone("Australia/Brisbane"));
        String strDateBrisbane = sdf.format(date);
        System.out.println(strDateBrisbane);
    }
}

输出:

1970-01-16T05:39:51.494Z[Coordinated Universal Time]
1970-01-16T15:39:51.494+10:00[Australian Eastern Standard Time]

ONLINE DEMO


* 出于任何原因,如果您必须坚持使用 Java 6 或 Java 7,您可以使用 ThreeTen-Backport,它将大部分 java.time 功能向后移植到 Java 6 & 7. 如果您正在为 Android 项目工作并且您的 Android API 级别仍然不符合 Java-8,请检查 Java 8+ APIs available through desugaringHow to use ThreeTenABP in Android Project

答案 1 :(得分:0)

“它似乎添加了” - 我怀疑你正在使用确实使用本地时区的Date.toString()Date对象本身实际上是UTC。使用DateFormat代替执行转换为字符串,您可以指定要使用的时区。您可能还需要使用Calendar - 这取决于您要做的事情。

(或者,首先使用Joda Time,这是一个更好的API。虽然对于您的Android项目可能有点笨重。如果有“Joda Time lite”,我不会感到惊讶为某种东西投射某个地方......)

编辑:快速样本,虽然不完全清楚你需要什么......

long millis = getMillisFromServer();
Date date = new Date(millis);
DateFormat format = new SimpleDateFormat("dd/MM/yyyy HH:mm:ss");
format.setTimeZone(customTimeZone);
String formatted = format.format(date);