Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/186.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 在Android上将UTC转换为本地时间_Java_Android_Utc - Fatal编程技术网

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

Java 在Android上将UTC转换为本地时间,java,android,utc,Java,Android,Utc,在我的项目中,我得到了json格式的API响应。我得到UTC时间格式的时间字符串值,如下所示2013年7月16日12:08:59 AM 我需要把这个改成当地时间。 这就是我们使用该应用程序时需要显示本地时间的地方。我该怎么做 以下是我尝试过的一些代码: String aDate = getValue("dateTime", aEventJson); SimpleDateFormat simpleDateFormat = new SimpleDateFormat("MMM dd, yyyy HH:

在我的项目中,我得到了json格式的API响应。我得到UTC时间格式的时间字符串值,如下所示
2013年7月16日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包含
2013年7月16日12:08:59 AM

使用以下代码

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);
这应该行得通。

以下是我的尝试:

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”…

我想提供一个现代答案。虽然2013年我们使用了
SimpleDataFormat
类来解析和格式化日期时间(除了Joda Time),但它现在已经过时很久了,而且我们在
java.Time
或JSR-310方面做得更好,后者是2014年java 8推出的现代java日期和时间API

//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);
但我听你说,大多数安卓设备仍然不运行Java8。幸运的是,您仍然可以通过ThreeTenABP(JSR-310到Android Java 7的后端口)在它们上使用现代Java日期和时间API。详情请参阅

现在代码是:

    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(“亚洲/加尔各答”)
    。JVM的默认时区可能会被程序的其他部分或在同一JVM中运行的其他程序更改,因此不可靠

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

这就是我在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


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

我觉得不错。怎么了?我得到了异常
java.text.ParseException:不可解析的日期:“2013年7月16日上午4:23:37”(偏移量21)
am/PM标记不是z。z停留在TimeZone我正在获取异常
java.text.ParseException:不可解析日期:“2013年7月16日4:23:37 am”(偏移量21)
I get
java.lang.IllegalArgumentException:无法将给定对象格式化为日期
。请共享您试图格式化的日期值,由于此错误仅在提供不正确的日期作为输入时发生。我收到异常
java.text.ParseException:Unparseable date:“Jul 16,2013 4:23:37 am”(偏移量21处)
此注释是用于此答案的吗?我之前也尝试过此代码,我在这一行中收到异常
date-date=df.parse(dateStr);请再试一次,我已经测试过了!别忘了用“a”(上午/下午标记)代替“z”(时区)。这是安卓api最低26级,不一定,@Boy。我在回答中提到的3TENABP是针对低于26的API级别的。啊,好的!嗯,我同意这个答案:对不起,孩子,这个答案不正确。自历元起的毫秒始终自历元起。根据时区和/或夏令时(DST)调整它们没有意义。如果您的代码最终给出了正确的结果,那么它仍然走错了方向,肯定会让未来的读者感到困惑。当然是你的选择。好吧,呃,孩子,听起来没什么错。为了确保它是正确的,您应该知道哪一天是当地时间07:00,因为偏移量在历史上发生了变化,并且可能会再次发生变化,而不仅仅是在夏季。例如,在中有一个启发性的讨论。我看不出您对现有4个答案中不止一个没有的问题有什么贡献?同样在2018年,请不要教年轻人使用过时且臭名昭著的
SimpleDateFormat
类。至少不是第一个选择。而且不是毫无保留的。今天我们有了更好的解决方案,我同意Ole V.V.,不要使用SimpleDataFormat