在Android上将UTC转换为本地时间

Mad*_*ech 44 java android utc

在我的项目中,我得到了json格式的API响应.我得到一个UTC时间格式的字符串值,如下所示Jul 16, 2013 12:08:59 AM.
我需要将其更改为本地时间.这就是我们使用此应用程序需要显示当地时间的地方.我该怎么做?

这是我尝试过的一些代码:

String aDate = getValue("dateTime", aEventJson);
SimpleDateFormat simpleDateFormat = new SimpleDateFormat("MMM dd, yyyy HH:mm:ss z");
simpleDateFormat.setTimeZone(TimeZone.getDefault());
String formattedDate = simpleDateFormat.format(aDate);
Run Code Online (Sandbox Code Playgroud)

假设aDate包含 Jul 16, 2013 12:08:59 AM

dev*_*ole 79

这是我的尝试:

String dateStr = "Jul 16, 2013 12:08:59 AM";
SimpleDateFormat df = new SimpleDateFormat("MMM dd, yyyy HH:mm:ss a", Locale.ENGLISH);
df.setTimeZone(TimeZone.getTimeZone("UTC"));
Date date = df.parse(dateStr);
df.setTimeZone(TimeZone.getDefault());
String formattedDate = df.format(date);
Run Code Online (Sandbox Code Playgroud)

还要注意am/pm标记的"a"...

  • 我收到异常`java.text.ParseException: Unparseable date: "Jul 16, 2013 4:23:37 AM" (at offset 21)` (2认同)

Ole*_*.V. 8

我想提出现代的答案.虽然SimpleDateFormat是2013年我们用于解析和格式化日期时间的类(除了Joda-Time),但它现在已经过时了,而且我们在java.timeJSR-310或现代Java日期和时间API 方面做得更好了.2014年推出Java 8.

但我听说大多数Android设备仍然没有运行Java 8.幸运的是,您仍然可以通过ThreeTenABP(JSR-310到Android Java 7的后端)使用现代Java日期和时间API.详细信息如下:如何在Android项目中使用ThreeTenABP.

现在的代码是:

    DateTimeFormatter formatter 
            = DateTimeFormatter.ofPattern("MMM dd, uuuu hh:mm:ss a", Locale.ENGLISH);
    String aDate = "Jul 16, 2013 12:08:59 AM";
    String formattedDate = LocalDateTime.parse(aDate, formatter)
            .atOffset(ZoneOffset.UTC)
            .atZoneSameInstant(ZoneId.systemDefault())
            .format(formatter);
    System.out.println(formattedDate);
Run Code Online (Sandbox Code Playgroud)

由于我的计算机正在运行欧洲/哥本哈根时区,该时区在7月比UTC早2小时,因此打印出来

Jul 16, 2013 02:08:59 AM
Run Code Online (Sandbox Code Playgroud)

更多要点:

  • 由于您的字符串中包含AM,因此我假设您的小时数在AM之内,从1到12.要正确解析和格式化它们,您需要h格式化模式字符串中的小写.大写H是从0到23的小时.
  • 欲为一个explcit区域设置格式化(无论是SimpleDateFormatDateTimeFormatter).如果没有给出语言环境,格式化程序将使用设备的默认语言环境."Jul"和"AM"是英文的,你的代码可以很好地运行在许多设备上,直到有一天它运行在具有非英语语言环境和崩溃的设备上,你很难搞清楚原因.
  • 如果可以,请明确给出所需的时区,例如ZoneId.of("Asia/Kolkata").JVM的默认时区可能会被程序的其他部分或在同一JVM中运行的其他程序更改,因此不可靠.


Ron*_*hia 8

1.本地到UTC转换器

public static String localToUTC(String dateFormat, String datesToConvert) {


        String dateToReturn = datesToConvert;

        SimpleDateFormat sdf = new SimpleDateFormat(dateFormat);
        sdf.setTimeZone(TimeZone.getDefault());
        Date gmt = null;

        SimpleDateFormat sdfOutPutToSend = new SimpleDateFormat(dateFormat);
        sdfOutPutToSend.setTimeZone(TimeZone.getTimeZone("UTC"));

        try {

            gmt = sdf.parse(datesToConvert);
            dateToReturn = sdfOutPutToSend.format(gmt);

        } catch (ParseException e) {
            e.printStackTrace();
        }
        return dateToReturn;
    }
Run Code Online (Sandbox Code Playgroud)

2. UTC 到本地转换器

public static String uTCToLocal(String dateFormatInPut, String dateFomratOutPut, String datesToConvert) {


    String dateToReturn = datesToConvert;

    SimpleDateFormat sdf = new SimpleDateFormat(dateFormatInPut);
    sdf.setTimeZone(TimeZone.getTimeZone("UTC"));

    Date gmt = null;

    SimpleDateFormat sdfOutPutToSend = new SimpleDateFormat(dateFomratOutPut);
    sdfOutPutToSend.setTimeZone(TimeZone.getDefault());

    try {

        gmt = sdf.parse(datesToConvert);
        dateToReturn = sdfOutPutToSend.format(gmt);

    } catch (ParseException e) {
        e.printStackTrace();
    }
    return dateToReturn; }
Run Code Online (Sandbox Code Playgroud)

  • 我看不出您对现有 4 个答案中不止一个中尚未出现的问题做出了哪些贡献?另外,在 2018 年,请不要教年轻人使用早已过时且非常麻烦的 `SimpleDateFormat` 类。至少不是第一个选择。而且并非毫无保留。今天,我们的 [`java.time`,现代 Java 日期和时间 API](https://docs.oracle.com/javase/tutorial/datetime/) 有了更好的表现 (3认同)

Tom*_*per 7

//your UTC time var
long time = UTCtime;

//convert it
Time timeFormat = new Time();
timeFormat.set(time+TimeZone.getDefault().getOffset(time));

//use the value
long localTime = timeFormat.toMillis(true);
Run Code Online (Sandbox Code Playgroud)