将日期和时间的字符串(2018-04-13T20:00:00.0400)转换为Kotlin中的日期字符串(2018年4月13日)

时间:2018-10-11 11:32:30

标签: android datetime exception kotlin runtime-error

我想将DateTime字符串(例如“ 2018-04-13T20:00:00.0400”)转换为“ April 13,2018”。我已经使用了代码

val sdf = SimpleDateFormat("yyyy/mm/dd", Locale.getDefault())
val startDate = sdf.parse(data.start_time)

但是使用此代码,我的应用程序崩溃了。关于此的任何帮助

日志显示此

2018-10-11 16:44:56.948 20482-21021/? E/NowController: Failed to access data from EntryProvider. ExecutionException.
java.util.concurrent.ExecutionException: com.google.android.apps.gsa.sidekick.main.h.n: Could not complete scheduled request to refresh entries. ClientErrorCode: 3
    at com.google.common.util.concurrent.d.eA(SourceFile:85)
    at com.google.common.util.concurrent.d.get(SourceFile:23)
    at com.google.common.util.concurrent.l.get(SourceFile:2)
    at com.google.android.apps.gsa.staticplugins.nowstream.b.a.be.cbB(SourceFile:49)
    at com.google.android.apps.gsa.staticplugins.nowstream.b.a.be.cbA(SourceFile:181)
    at com.google.android.apps.gsa.staticplugins.nowstream.b.a.bh.run(Unknown Source:2)
    at com.google.android.apps.gsa.shared.util.concurrent.at.run(SourceFile:4)
    at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:458)
    at java.util.concurrent.FutureTask.run(FutureTask.java:266)
    at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:458)
    at java.util.concurrent.FutureTask.run(FutureTask.java:266)
    at com.google.android.apps.gsa.shared.util.concurrent.b.g.run(Unknown Source:4)
    at com.google.android.apps.gsa.shared.util.concurrent.b.aw.run(SourceFile:4)
    at com.google.android.apps.gsa.shared.util.concurrent.b.aw.run(SourceFile:4)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1167)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:641)
    at java.lang.Thread.run(Thread.java:764)
    at com.google.android.apps.gsa.shared.util.concurrent.b.i.run(SourceFile:6)
 Caused by: com.google.android.apps.gsa.sidekick.main.h.n: Could not complete scheduled request to refresh entries. ClientErrorCode: 3
    at com.google.android.apps.gsa.staticplugins.nowstream.b.a.ar.az(Unknown Source:4)
    at com.google.common.util.concurrent.q.ap(SourceFile:7)
    at com.google.common.util.concurrent.p.run(SourceFile:32)
    at com.google.common.util.concurrent.bt.execute(SourceFile:3)
    at com.google.common.util.concurrent.d.b(SourceFile:275)
    at com.google.common.util.concurrent.d.addListener(SourceFile:135)
    at com.google.common.util.concurrent.p.b(SourceFile:3)
    at com.google.android.apps.gsa.shared.util.concurrent.h.a(SourceFile:16)
    at com.google.android.apps.gsa.shared.util.concurrent.h.a(SourceFile:13)
    at com.google.android.apps.gsa.staticplugins.nowstream.b.a.be.cbB(SourceFile:47)

4 个答案:

答案 0 :(得分:3)

tl; dr

使用现代的 java.time 类,而不要使用可怕的旧类。

这是Java语法(我尚未学习Kotlin)。

LocalDateTime                             // Represent a date with time-of-day but lacking offset-from-UTC or time zone. As such, this does *not* represent a moment, is *not* a point on the timeline.
.parse( "2018-04-13T20:00:00.0400" )      // Parse an input string in standard ISO 8601 format. Returns a `LocalDateTime` object.
.toLocalDate()                            // Extract the date-only portion without the time-of-day. Still no time zone or offset-from-UTC. Returns a `LocalDate` object.
.format(                                  // Generate text representing the value of that `LocalDate` object.
    DateTimeFormatter                     // Define a pattern to use in generating text.
    .ofLocalizedDate( FormatStyle.LONG )  // Automatically localize, specifying how long/abbreviated…
    .withLocale( Locale.US )              // … and what human language and cultural norms to use in localizing.
)                                         // Return a `String`. 
  

2018年4月13日

对于早期的Android,请参阅下面底部的项目符号。

使用 java.time

  

将DateTime字符串(例如“ 2018-04-13T20:00:00.0400”)转换为“ 2018年4月13日”。

您使用的是可怕的旧日期时间类,而这些类早已被 java.time 类取代。

首先,解析您的输入字符串。但是,.0400到底是什么?也许是几分之一秒?但是通常,毫秒,微秒或纳秒以3位数字的组显示。因此,您的四位数是奇数。也许是UTC的补偿?四位数字是正确的,对于小时和分钟,前导零。但是没有 plus minus 符号来表示UTC之前或之后。因此,我将使用小数秒。

您的输入缺少任何偏离UTC或时区的指示。因此解析为LocalDateTime。您的字符串为标准ISO 8601格式。在 java.time 类中默认使用标准格式。

String input = "2018-04-13T20:00:00.0400";
LocalDateTime ldt = LocalDateTime.parse( input );
  

ldt.toString():2018-04-13T20:00:00.040

提取日期部分。

LocalDate ld = ldt.toLocalDate() :
  

ld.toString():2018-04-13

生成表示该日期值的文本。让 java.time 自动本地化。要本地化,请指定:

  • FormatStyle来确定字符串应该是多长时间或缩写。
  • Locale确定:
    • 用于翻译日名,月名等的人类语言
    • 文化规范决定缩写,大写,标点,分隔符等问题。

代码:

DateTimeFormatter f = DateTimeFormatter.ofLocalizedDate( FormatStyle.LONG ).withLocale( Locale.US );
String output = ld.format( f );
  

2018年4月13日

当心:LocalDateTime对象不是不是瞬间,是不是在时间轴上的一点。缺少来自UTC的偏移或时区意味着它代表了大约26-27小时(全球当前时区范围)内的潜在时刻范围。如果输入字符串被隐式表示某个区域的墙上时钟时刻,则应在提取ZoneId之前应用ZonedDateTime来获取LocalDate对象。在堆栈溢出之前,已经多次显示了这一点。


关于 java.time

java.time框架已内置在Java 8及更高版本中。这些类取代了麻烦的旧legacy日期时间类,例如java.util.DateCalendarSimpleDateFormat

目前位于Joda-Timemaintenance mode项目建议迁移到java.time类。

要了解更多信息,请参见Oracle Tutorial。并在Stack Overflow中搜索许多示例和说明。规格为JSR 310

您可以直接与数据库交换 java.time 对象。使用符合JDBC driver或更高版本的JDBC 4.2。不需要字符串,不需要java.sql.*类。

在哪里获取java.time类?

ThreeTen-Extra项目使用其他类扩展了java.time。该项目为将来可能在java.time中添加内容提供了一个试验场。您可能会在这里找到一些有用的类,例如IntervalYearWeekYearQuartermore

答案 1 :(得分:0)

您需要以正确的方式格式化。试试下面的代码,您应该将ISO日期格式转换为普通日期格式。谢谢

fun convertISOTimeToDate(isoTime: String): String? {
        val sdf = SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS'Z'")
        var convertedDate: Date? = null
        var formattedDate: String? = null
        try {
            convertedDate = sdf.parse(isoTime)
            formattedDate = SimpleDateFormat("dd-MM-yyyy" + "\n" + " hh:mm:ss a").format(convertedDate)
        } catch (e: ParseException) {
            e.printStackTrace()
        }

        return formattedDate
    }

答案 2 :(得分:0)

上述内容的固定版本,因为您的日期输入中没有Z。而且它们的输出格式与您不匹配。我建议阅读文档https://docs.oracle.com/javase/6/docs/api/java/text/SimpleDateFormat.html 这样,您可以根据需要修改响应。

fun convertISOTimeToDate(isoTime: String): String? {
    val sdf = SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS")
    var convertedDate: Date? = null
    var formattedDate: String? = null
    try {
        convertedDate = sdf.parse(isoTime)
        formattedDate = SimpleDateFormat("MMMMM dd,yyyy").format(convertedDate)
    } catch (e: ParseException) {
        e.printStackTrace()
    }

    return formattedDate
}

答案 3 :(得分:0)

科特林语法LocaleDateTime.parse(示例)=>

val date = LocalDateTime
    .parse(q.ADDDATE)
    .toLocalDate()
    .format(
        DateTimeFormatter
            .ofLocalizedDate(FormatStyle.LONG)
            .withLocale(Locale.ENGLISH)
    )

val dateView = date