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

woobm2wo  于 2023-03-21  发布在  Android
关注(0)|答案(8)|浏览(170)

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

假设a日期包含Jul 16, 2013 12:08:59 AM

hlswsv35

hlswsv351#

下面是我的尝试:

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”代表上午/下午标记...

suzh9iv8

suzh9iv82#

我想给出一个现代的答案:虽然SimpleDateFormat是我们在2013年用来解析和格式化日期时间的类(Joda-Time除外),但它现在已经过时了,我们在java.time或JSR-310中有了更好的类,JSR-310是2014年Java 8推出的现代Java日期和时间API。
但我听到你说,大多数Android设备仍然不运行Java 8。幸运的是,你仍然可以通过JSR-310到Android Java 7的后端口ThreeTenABP在它们身上使用现代的Java日期和时间API。详细信息在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的小时。
  • 最好给予格式化程序一个explicit locale(SimpleDateFormatDateTimeFormatter)。如果没有给定locale,格式化程序将使用设备的默认locale。“Jul”和“AM”是英语,您的代码可能在许多设备上运行良好,直到有一天它在非英语locale的设备上运行时崩溃,您很难找出原因。
  • 如果可以,请明确给予所需的时区,例如ZoneId.of("Asia/Kolkata")。JVM的默认时区可能会被程序的其他部分或运行在同一JVM中的其他程序更改,因此不可靠。
zynd9foi

zynd9foi3#

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

htrmnn0y4#

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

rqmkfv5c5#

使用以下代码。

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

这应该行得通。

hwazgwia

hwazgwia6#

这是我如何在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);

当服务器发送带有时区的时间时,我必须将(3600*3)添加到getTime并将其保存到utcTime中,这样utcTime就是UTC。然后我将电话当前时区的偏移添加到utcTime中。在我的情况下,我的时区是它的打印:

20:30 12/01/2021

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

o4hqfura

o4hqfura7#

使用此代码:

public static String stringDateWithTimezone(Date date, String pattern, TimeZone timeZone) {
        try {
            SimpleDateFormat simpleDateFormat = new SimpleDateFormat(pattern, Locale.US);
            if (timeZone != null) {
                simpleDateFormat.setTimeZone(timeZone);
            }
            return simpleDateFormat.format(date);
        } catch (Exception e) {
            Timber.e(e);
            return null;
        }
    }

调用另一个类:

String dateUtc = DateUtil.stringDateWithTimezone(new Date(), "yyyy-MM-dd hh:mm:ss", TimeZone.getTimeZone("UTC"));
0sgqnhkj

0sgqnhkj8#

我想把UTC时间戳转换为本地时间戳进行一些计算。这是我所做的

val refreshed = Prefs.getLong(requireContext(), "refreshed_time")
  val calendar = Calendar.getInstance()
  calendar.timeInMillis = refreshed
  calendar.timeZone = TimeZone.getDefault()

  val localTimestamp = calendar.timeInMillis

相关问题