You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Kotlin JS中调用Date.getHours()报TypeError问题求助

解决Kotlin JS中Date.getHours()抛出TypeError的问题

这个问题我之前也碰到过,核心原因是你以为拿到的是kotlin.js.Date实例,但实际上它可能是一个字符串或者普通JS对象——哪怕console.log输出看起来是标准日期格式,也不代表它是有效的Date对象。

先排查变量的真实类型

先别急着调用方法,先确认这个变量的实际类型:

  • 在浏览器控制台执行:console.log(typeof yourDateVariable),如果输出是string,那问题根源就找到了;
  • 或者在Kotlin代码里加个类型判断:
    if (yourDate is Date) {
        println("这是有效的Date实例")
    } else {
        println("实际类型是${yourDate::class.simpleName}")
    }
    

常见原因和对应解决方案

1. JSON反序列化时的类型不匹配

如果这个Date属性是从JSON接口获取的,Kotlin JS默认不会自动把ISO格式的字符串转换成kotlin.js.Date。比如用JSON.parse()解析后,日期字段依然是字符串类型,而非Date实例。

解决办法:

  • 手动转换字符串为Date实例:
    val dateString = "2019-12-29T13:30:00.000+0000"
    val validDate = Date(dateString)
    println(validDate.getHours()) // 现在可以正常调用方法了
    
  • 如果使用kotlinx.serialization做序列化,需要给Date属性指定自定义序列化器:
    import kotlinx.serialization.Serializable
    import kotlinx.serialization.descriptors.PrimitiveKind
    import kotlinx.serialization.descriptors.PrimitiveSerialDescriptor
    import kotlinx.serialization.encoding.Decoder
    import kotlinx.serialization.encoding.Encoder
    import kotlin.js.Date
    
    object DateSerializer : kotlinx.serialization.KSerializer<Date> {
        override val descriptor = PrimitiveSerialDescriptor("Date", PrimitiveKind.STRING)
    
        override fun serialize(encoder: Encoder, value: Date) {
            encoder.encodeString(value.toISOString())
        }
    
        override fun deserialize(decoder: Decoder): Date {
            return Date(decoder.decodeString())
        }
    }
    
    // 在数据类中使用该序列化器
    @Serializable
    data class YourDataClass(
        @Serializable(with = DateSerializer::class)
        val date: Date
    )
    

2. 错误地将字符串直接赋值给Date类型属性

虽然Kotlin是强类型语言,但如果通过JS互操作的动态类型方式,把字符串塞进了Date类型的属性,编译时不会报错,但运行时变量实际是字符串,自然调用不了getHours()方法。这种情况只要确保赋值的是Date实例而非字符串即可。

验证有效性

转换完成后,你可以在控制台打印validDate,如果是有效的Date对象,控制台会显示类似Date Wed Dec 29 2019 14:30:00 GMT+0100 (Central European Standard Time)的格式,而非单纯的字符串。

内容的提问来源于stack exchange,提问作者PaulNUK

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.14 08:57:55