我在如何完成以下操作时没有作弊和使用asInstanceOf.
假设我有一些任意密封类型的对象,每个对象都有自己的类型成员.
sealed trait Part { type A }
case object P1 extends Part { override type A = String }
case object P2 extends Part { override type A = Int }
Run Code Online (Sandbox Code Playgroud)
现在说我将P和PA值捆绑在一起......
trait PartAndA {
val p: Part
val a: p.A
}
object PartAndA {
type Aux[P <: Part] = PartAndA {val p: P}
def apply(_p: Part)(_a: _p.A): Aux[_p.type] =
new PartAndA {
override val p: _p.type = _p
override val a = _a
}
} …Run Code Online (Sandbox Code Playgroud) 给定a ZonedDateTime,在某些情况下,调用toString会ZonedDateTime.parse返回不同的时间.
这是一个具体的例子.代码在Scala中,但它在Java中没有什么不同.
import java.time._
val t = 1193534827725L
val z = ZoneId.of("Europe/Paris")
val a = Instant.ofEpochMilli(t).atZone(z) // 2007-10-28T02:27:07.725+01:00[Europe/Paris]
val b = ZonedDateTime.parse(a.toString) // 2007-10-28T02:27:07.725+02:00[Europe/Paris]
a == b // returns false!
Run Code Online (Sandbox Code Playgroud)
重新解析的值也有不同的epochMilli:
scala> List(a, b).map(_.toInstant.toEpochMilli)
res46: List[Long] = List(1193534827725, 1193531227725)
scala> List(a, b).map(_.toInstant.toEpochMilli == t)
res47: List[Boolean] = List(true, false)
Run Code Online (Sandbox Code Playgroud)
使用.format(DateTimeFormatter.ISO_ZONED_DATE_TIME)而不是.toString也不起作用.
根据Javadoc的推荐Instant#atZone,参考https://docs.oracle.com/javase/8/docs/api/java/time/ZonedDateTime.html#ofInstant-java.time.Instant-java.time.ZoneId-
将瞬间转换为分区日期时间很简单,因为每个瞬间只有一个有效偏移量.
这是怎么回事?
编辑:还值得一提的是,在采样时间(ref)周围发生了夏令时,因此有两个实例02:27:07.725.正如您从.toString偏移中看到的那样是正确的,但解析似乎并不尊重它.