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
相关产品推荐
相关产品推荐

