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

时间:2013-07-16 13:15:01

标签: 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);

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

6 个答案:

答案 0 :(得分:61)

这是我的尝试:

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

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

答案 1 :(得分:7)

我想提供现代答案。虽然SimpleDateFormat是我们在2013年解析和格式化日期时间的类(除了Joda-Time),但它现在已经过时了,我们在java.time或JSR-310中有了更好的表现,2014年Java 8推出的现代Java日期和时间API。

但是我听说你说大多数Android设备仍然没有运行Java 8。幸运的是,您仍然可以通过ThreeTenABP使用现代Java日期和时间API,这是JSR-310到Android Java 7的后端。详细信息位于this question: How to use ThreeTenABP in Android Project

现在代码是:

    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的小时。
  • 更喜欢为格式化程序提供explcit语言环境(无论SimpleDateFormat还是DateTimeFormatter)。如果没有给出语言环境,格式化程序将使用设备的默认语言环境。 “Jul”和“AM”是英文的,你的代码可以很好地运行在许多设备上,直到有一天它运行在具有非英语语言环境和崩溃的设备上,你很难搞清楚原因。
  • 如果可以,请明确提供所需的时区,例如ZoneId.of("Asia/Kolkata")。 JVM的默认时区可能会被程序的其他部分或在同一JVM中运行的其他程序更改,因此不可靠。

答案 2 :(得分:3)

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

答案 3 :(得分:1)

使用以下代码。

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

//Your Code
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);

这应该有用。

答案 4 :(得分:1)

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

答案 5 :(得分: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

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