【问题标题】:How to convert to String with DateTimeFormatter如何使用 DateTimeFormatter 转换为字符串
【发布时间】:2019-09-20 10:34:42
【问题描述】:

现在我的数据库日期为 Long:

val time = target?.date ?: 0L

然后我将其转换为日期:

val date = Date(time)

在此之后用作字符串来显示我的日期:

val format = SimpleDateFormat("d MMMM, yyyy")
format.format(date)

一切正常

但现在我想用DateTimeFormatter 做同样的事情 这可能吗?

【问题讨论】:

  • format.format(date) 返回该字符串
  • 您打算使用DateTimeFormatter 类吗? API 有点不同:docs.oracle.com/javase/8/docs/api/java/time/format/…
  • @Edric 是的,我开始使用 API,但我的问题是我最初输入的是 Long。所以我不知道如何从 long 转换为 string
  • DateTimeFormatter 适用于 fx LocalDate 这是如何将long 转换为LocalDate 的问题吗?
  • @Selvin 我更新了问题,希望现在变得更容易理解

标签: android kotlin datetime-format


【解决方案1】:

尝试这样做:

val shortFormat : DateTimeFormatter =
    DateTimeFormat.forPattern("MM/dd/yy").withZone(PST)
val formatted : String = shortFormat.print(time)

【讨论】:

    【解决方案2】:

    在继续阅读之前,您应该查看DateTimeFormatter class 的文档。无论如何,您可以使用LocalDateDateTimeFormatter 类。

    查看LocalDate class 文档,我发现有一种方法可以通过LocalDate#ofEpochDay 方法指定long。

    无论如何,DateTimeFormatter 类文档中有一个代码示例,我将在此处逐字复制,但适用于使用 LocalDate#ofEpochDay 方法:

    val date = LocalDate.ofEpochDay(target?.date ?: 0L)
    val formatter = DateTimeFormatter.ofPattern("d MMMM, yyyy")
    val format = date.format(formatter)
    

    此外,我还缩短了解决您的问题所需的代码量。

    希望这会有所帮助! (P.S. 到目前为止,我还没有测试上面的代码示例。)

    【讨论】:

    • 获取下一个错误:org.threeten.bp.DateTimeException: Invalid value for EpochDay (valid values -365243219162 - 365241780471): 1569715200000
    【解决方案3】:

    您应该将您的 Date 对象转换为 LocalDate 并从那里直截了当。这是一个使用Kotlin Playground的工作示例

    fun formatMillisUsingDateTimeFormatter(millis: Long): String {
        val date = Date(millis).toInstant().atZone(ZoneId.systemDefault()).toLocalDate()
    
        val formatter = DateTimeFormatter.ofPattern("d MMMM yyyy", Locale.getDefault())
    
        return date.format(formatter)
    }
    

    LocalDate 对象具有 #format,它直接获取 DateTimeFormatter 以将自身转换为字符串。现在,要将Date 对象转换为LocalDate 对象,它涉及多个转换,我建议不要这样做,但是您需要将其转换为Instant,然后是ZonedDateTime,最后转换为LocalDate

    【讨论】:

    • 我使用库 implementation 'com.jakewharton.threetenabp:threetenabp:1.2.1', 不明白为什么你的方法需要 API 26...
    • 因为自 Android API 1 以来 java API 不可用。您应该查看 android 文档。
    【解决方案4】:

    正如@edric 提到的,我们可以使用LocalDate 来格式化DateTimeFormatter

    要将 long(例如毫秒)转换为 LocalDate,我们可以使用多种方式。

    val dateTimeFormatter = DateTimeFormatter.ofPattern("yyyy MM dd")
    
    1. 第一种方式(Ref : java.time.LocalDate#now(java.time.Clock) or org.threeten.bp.LocalDate#now(java.time.Clock))

      LocalDate.ofEpochDay(Math.floorDiv(time, 24 * 60 * 60 * 1000)).format(dateTimeFormatter)

    我们可以使用Calendar的第二种和第三种方式

    2.

        var time = target?.date ?: 0L
    
        var calendar = Calendar.getInstance()
        calendar.timeInMillis = time
    
        LocalDate.of(calendar.get(Calendar.YEAR),
            calendar.get(Calendar.MONTH) + 1,
            calendar.get(Calendar.DAY_OF_MONTH)
        ).format(dateTimeFormatter)
    

    3.

        var time = target?.date ?: 0L
    
        var calendar = Calendar.getInstance()
        calendar.timeInMillis = time
    
        LocalDate.ofYearDay(calendar.get(Calendar.YEAR), calendar.get(Calendar.DAY_OF_YEAR)).format(dateTimeFormatter)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-11-14
      • 2020-09-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-08-17
      • 2012-12-28
      • 1970-01-01
      相关资源
      最近更新 更多