【问题标题】:Kotlin LocalDateTime as Long [duplicate]Kotlin LocalDateTime as Long [重复]
【发布时间】:2020-08-28 13:15:38
【问题描述】:

我正在尝试将我的 LocalDateTime 字段保存为 long,以便我可以将其存储在我的 SQLite 数据库中。我怎么能做到这一点?

var datetime = LocalDateTime.now()
var longdt: Long = getString(datetime).toLong()

【问题讨论】:

    标签: java android kotlin localdatetime


    【解决方案1】:

    您可以使用toEpochSecond() 和ofEpochSecond() 将long 值转换为/从long 值精确到秒。

    示例(在 Java 中)

    LocalDateTime now = LocalDateTime.now();
    long nowInSeconds = now.toEpochSecond(ZoneOffset.UTC);
    LocalDateTime dateTime = LocalDateTime.ofEpochSecond(nowInSeconds, 0, ZoneOffset.UTC);
    
    System.out.println("now = " + now);
    System.out.println("nowInSeconds = " + nowInSeconds);
    System.out.println("dateTime = " + dateTime);
    

    输出

    now = 2020-05-12T12:12:36.984263200
    nowInSeconds = 1589285556
    dateTime = 2020-05-12T12:12:36
    

    如果您需要精确到毫秒的 long 值,请执行以下操作:

    LocalDateTime now = LocalDateTime.now();
    long nowInMillis = now.toEpochSecond(ZoneOffset.UTC) * 1000
                     + now.get(ChronoField.MILLI_OF_SECOND);
    LocalDateTime dateTime = LocalDateTime.ofEpochSecond(nowInMillis / 1000,
                      (int) (nowInMillis % 1000 * 1000000), ZoneOffset.UTC);
    
    System.out.println("now = " + now);
    System.out.println("nowInMillis = " + nowInMillis);
    System.out.println("dateTime = " + dateTime);
    

    输出

    now = 2020-05-12T12:16:38.881510700
    nowInMillis = 1589285798881
    dateTime = 2020-05-12T12:16:38.881
    

    如果需要,指定UTC 以外的区域偏移量,但在这种情况下,您应该使用ZonedDateTime 或OffsetDateTime 而不是LocalDateTime。

    【讨论】:

      【解决方案2】:

      如果用 long 表示秒数或毫秒数,请使用这种方式。

      LocalDateTime 以 Epoch 秒为单位

      val seconds = datetime.atZone(ZoneOffset.UTC).toEpochSecond())
      

      LocalDateTime 到纪元毫秒

      val milliseconds = datetime.atZone(ZoneOffset.UTC)?.toInstant()?.toEpochMilli()
      

      【讨论】:

      • 问题是如何从LocalDateTime 中获取long 值,而不是此处显示的其他方式。
      • @Andreas 好的,我认为 long 意味着 epoch 秒。我不明白你的意思。
      • 我正在查看此答案的旧版本,它将 seconds 值转换为 LocalDateTime 值。
      • atZone() 无法返回null,那么为什么要使用?.? --- 为什么不使用datetime.toEpochSecond(ZoneOffset.UTC)? --- 为什么不使用datetime.toInstant(ZoneOffset.UTC).toEpochMilli()?
      • 展开“From class ChronoLocalDateTime”(在方法列表下方)。这是来自该接口的default 方法。
      猜你喜欢
      • 2021-07-26
      • 2019-11-27
      • 2022-10-14
      • 2018-11-10
      • 2017-03-22
      • 2015-05-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多