Kotlin JavaScript Date.now()返回类型

时间:2018-02-01 05:09:18

标签: javascript datetime kotlin

我想知道为什么Kotlin JavaScript Date类为getTime函数返回Double。根据{{​​3}},getTime函数应返回自1970年1月1日00:00:00 UTC以来的毫秒数。

我知道JS没有64位数字表示,但是自从Kotlin documentation我认为Date.now()Date().getTime()返回的值应该是Long。至少,返回Int。

会更有意义

有没有理由它返回Double而不是整数?

2 个答案:

答案 0 :(得分:2)

有两个不同的原因:一致性和性能。 但在我进入之前请注意,您可以通过扩展轻松获得所需的行为,例如:

inline val Date.time get() = getTime().toLong()

println(Date().time) // 1522757176433
  1. 一致性。正如您在日期documentation page中看到的那样,它是external类。这意味着它只描述了现有的JavaScript API。重复使用它是一个很好的设计决策吗?也许不吧。但它有一个JS人们熟悉的好处。更改单个函数的返回类型会破坏整个API并使整个API非常不一致。

  2. 性能。可以隐藏原始getTime并创建辅助函数。但请记住,为了模仿Long Kotlin创建一个具有2个数字的对象。创建,比较,二进制操作,存储 - 模拟Long的执行比本机JS数字差很多。

  3. 总结。更改返回类型会使API不一致且效率低下。如果您重视语义而不是性能,那么只需编写一些辅助函数。

    P.S。我认为Date API将在某些时候重新设计,以便在多平台项目中使用它。但这是另一个故事。

答案 1 :(得分:0)

在kotlin中使用日期()。时间。它将返回您将获得整数的长值

   val s= Date().time
   print(s)

例如

    val date = "01-02-2018 07:05:00.999"
    val fmt = SimpleDateFormat("MM-dd-yyyy HH:mm:ss.S") //parse date based your format
    var myDate: Date? = null
    try {
        myDate = fmt.parse(date)
    } catch (e: ParseException) {
        e.printStackTrace()
    }
    println(myDate)
    val timestamp = myDate!!.time //timestamp values in long only not double
    println(timestamp)