将日期字符串从Java / Kotlin中的“ 2020-05-08T11:01:48.3300000Z”日期时间字符串格式化为m / d / yyyy的正确方法是什么

问题描述 投票:0回答:5

我正在尝试格式化从服务器接收到的DateTime字符串。我使用了以下格式,但没有一种有效-AppConstants.API_DATE_TIME_FORMAT =

 - `"yyyy-MM-dd'T'HH:mm:ss.SSS'Z'"`
 - `"yyyy-MM-dd'T'HH:mm:ss.SSSZ'Z'"`
 - `"yyyy-MM-dd'T'HH:mm:ss.SSSZ"`
 - `"yyyy-MM-dd'T'HH:mm:ss.SSSXX'Z'"`
 - `"yyyy-MM-dd'T'hh:mm:ss.SSSSSS'Z'"`

 and - 

     fun getFormattedDate(apiFormatDateTime: String): String {
        return try{
            val parser = SimpleDateFormat(AppConstants.API_DATE_TIME_FORMAT, Locale.getDefault())
            val formatter = SimpleDateFormat(AppConstants.UI_DATE_FORMAT, Locale.getDefault())
            val date = parser.parse(apiFormatDateTime)!!
            formatter.format(date)
        }catch (ex : Exception){
            apiFormatDateTime
        }
    }
java datetime kotlin utc
5个回答
1
投票

此作品

        String d="2020-05-08T11:01:48.3300000Z";
        DateFormat originalFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSSSSS'Z'");
        DateFormat targetFormat = new SimpleDateFormat("yyyyMMdd");
        Date date = originalFormat.parse(d);
        String formattedDate = targetFormat.format(date); 
        System.out.println("date==>"+formattedDate);

输出::

date==>20200508

0
投票

您可以尝试使用LocalDateTime和DateTimeFormatter

String str = "1986-04-08 12:30";
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm");
LocalDateTime dateTime = LocalDateTime.parse(str, formatter);
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm");
LocalDateTime dateTime = LocalDateTime.of(1986, Month.APRIL, 8, 12, 30);
String formattedDateTime = dateTime.format(formatter); // "1986-04-08 12:30"

贷方:https://stackoverflow.com/a/22463063/9297896


0
投票

您可以尝试如下操作

try {
            XMLGregorianCalendar dt = DatatypeFactory.newInstance().newXMLGregorianCalendar("2020-05-13T12:12:12.123456Z");
            String dateValue = new SimpleDateFormat("MM/dd/yyyy").format(dt.toGregorianCalendar().getTime());
            System.out.println("datevalue="+dateValue);
        } catch (DatatypeConfigurationException e) {
            e.printStackTrace();
        }   

输出:datevalue = 05/13/2020


0
投票

[这是我如何从UTC格式获取日期和时间-

    const val API_DATE_TIME_FORMAT = "yyyy-MM-dd'T'HH:mm:ss.SSSSSSS'Z'"
    const val UI_DATE_FORMAT = "MM/dd/yyyy"
    const val UI_TIME_FORMAT = "hh:mm:ss a"

/**
     * Function for getting date from api datetime string
     * @return formatted time
     */
    fun getFormattedDate(apiFormatDateTime: String): String {
        return try{
            val parser = SimpleDateFormat(AppConstants.API_DATE_TIME_FORMAT, Locale.getDefault())
            parser.timeZone = TimeZone.getTimeZone("UTC")
            val formatter = SimpleDateFormat(AppConstants.UI_DATE_FORMAT, Locale.getDefault())
            val date = parser.parse(apiFormatDateTime)!!
            formatter.timeZone = TimeZone.getDefault()
            formatter.format(date)
        }catch (ex : Exception){
            apiFormatDateTime
        }
    }

    /**
     * Function for getting time from api datetime string
     * @return formatted time
     */
    fun getFormattedTime(apiFormatDateTime: String): String {
        return try{
            val parser = SimpleDateFormat(AppConstants.API_DATE_TIME_FORMAT, Locale.getDefault())
            parser.timeZone = TimeZone.getTimeZone("UTC")
            val formatter = SimpleDateFormat(AppConstants.UI_TIME_FORMAT, Locale.getDefault())
            formatter.timeZone = TimeZone.getDefault()
            formatter.format(parser.parse(apiFormatDateTime)!!)
        }catch (ex : Exception){
            apiFormatDateTime
        }
    }

0
投票

java.time

我建议您使用Java.time(现代Java日期和时间API)进行日期和时间工作。在Java中(因为这是我可以写的):

    ZoneId zone = ZoneId.of("Asia/Kolkata");
    DateTimeFormatter uiDateFormatter = DateTimeFormatter.ofPattern("M/d/uuuu");

    String isoF8601ormatDateTime = "2020-05-08T11:01:48.3300000Z";
    Instant time = Instant.parse(isoF8601ormatDateTime);
    String uiString = time.atZone(zone)
            .format(uiDateFormatter);

    System.out.println(uiString);

输出为:

5/8/2020

注意事项:

  • API的格式为ISO8601。java.time的类将最常见的ISO 8601变体解析为其默认值,也就是说,我们无需指定任何格式化程序。
  • 我的代码还会在格式化之前将日期转换为用户的时区。大多数用户会期望这一点。请把您的用户所在的时区放在我在亚洲/加尔各答的位置。

奖金信息:也可以在用户所在的时区设置时间格式:

    DateTimeFormatter uiTimeFormatter
            = DateTimeFormatter.ofPattern("hh:mm:ss a", Locale.ENGLISH);
    String uiTimeString = time.atZone(zone).format(uiTimeFormatter);
    System.out.println(uiTimeString);

[04:31:48 PM

您的尝试出了什么问题?

  • SimpleDateFormat无法正确解析秒的7位小数。它仅支持毫秒,正好是三个小数。 SimpleDateFormat花费3300000毫秒,即3300秒或将近一个小时,这将添加到解析的时间中。]
  • 传入字符串中的[Z是UTC偏移量(零),需要按原样进行解析,否则您将得到不正确的结果。
  • Z(不带引号)将解析与+0000类似的偏移量,但与Z相似。 XX将解析Z,但是该尝试失败了,因为在Z之后还需要(一个)Z
  • 格式化前您没有转换到用户的时区。
  • 链接

© www.soinside.com 2019 - 2024. All rights reserved.