65

在我的项目中,我得到了 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);

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

4

6 回答 6

120

这是我的尝试:

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);

还要注意上午/下午标记的“a”...

于 2013-07-16T13:34:01.343 回答
13

我想贡献现代答案。虽然SimpleDateFormat是我们在 2013 年用于解析和格式化日期时间的类(除了 Joda-Time),但它现在已经过时了,而且我们在 JSR-310 或 JSR-310 中拥有更好的java.time功能,这是现代 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);

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

Jul 16, 2013 02:08:59 AM

进一步的要点:

  • 由于您的字符串中有 AM,我假设您的时间在 AM 内,从 1 到 12。要正确解析和格式化它们,您需要h在格式模式字符串中使用小写字母。大写H表示从 0 到 23 的小时。
  • 更喜欢为格式化程序提供明确的语言环境(无论是SimpleDateFormat还是DateTimeFormatter)。如果没有给出语言环境,格式化程序将使用设备的默认语言环境。“Jul”和“AM”是英文的,你的代码可能在许多设备上运行良好,直到有一天它在非英语语言环境的设备上运行并崩溃,你很难弄清楚原因。
  • 如果可以,请明确给出所需的时区,例如ZoneId.of("Asia/Kolkata"). JVM 的默认时区可能会被您程序的其他部分或在同一 JVM 中运行的其他程序更改,因此不可靠。
于 2017-11-16T16:42:44.670 回答
5

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;
    }

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; }
于 2018-07-11T13:57:25.663 回答
4
//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);
于 2014-12-27T21:14:59.377 回答
2

使用以下代码。

TimeZone defaultTimeZone = TimeZone.getDefault();
String strDefaultTimeZone = defaultTimeZone.getDisplayName(false, TimeZone.SHORT);

//The code you use
String aDate = getValue("dateTime", aEventJson);
SimpleDateFormat simpleDateFormat = new SimpleDateFormat("MMM dd, yyyy HH:mm:ss z");
simpleDateFormat.setTimeZone(TimeZone.getTimeZone(strDefaultTimeZone));
String formattedDate = simpleDateFormat.format(aDate);

这应该有效。

于 2013-07-16T13:26:07.353 回答
1

这就是我在 android Build.VERSION.SDK_INT < 26 上的做法

int offset = TimeZone.getDefault().getRawOffset();
String str_date='20:30 12-01-2021';
DateFormat formatter = new SimpleDateFormat("HH:mm dd-MM-yyy",Locale.US);
Date date = formatter.parse(str_date);
long utcTime = date.getTime() + (3600000*3);
SimpleDateFormat sdf = new SimpleDateFormat("HH:mm dd/MM/yyyy", Locale.US);
String dateStr = sdf.format(utcTime + offset);
System.out.println(dateStr);

当我的服务器使用 -3 时区发送时间时,我必须将 (3600*3) 添加到 getTime 并将其保存到 utcTime,这样 utcTime 就是 UTC。然后我将手机当前时区的偏移量添加到 utcTime。在我的情况下,因为我的时区是 -3 它的打印:

20:30 12/01/2021

但如果我改变我的时区,日期也会改变。

于 2021-01-12T15:57:00.380 回答