如何在Scala与ScalaJS中格式化/解析日期?跨端共享代码最佳实践
Scala.js 跨JVM/JS共享代码的日期处理方案
能否在共享代码中实现日期解析与格式化?
可以实现,但需要借助跨平台抽象或兼容类库来规避Scala.js对java.text.SimpleDateFormat等解析类的支持限制。
最佳实践方案
1. 使用跨平台日期类库(优先推荐)
scala-java-time是专为Scala.js设计的日期库,JVM端直接复用原生java.time API,JS端提供完全兼容的实现,无需编写平台特定代码即可在共享模块中完成日期解析与格式化。
共享代码示例:
import java.time.LocalDateTime import java.time.format.DateTimeFormatter object DateUtils { // 解析文本为日期 def parseDate(dateStr: String, pattern: String): LocalDateTime = { val formatter = DateTimeFormatter.ofPattern(pattern) LocalDateTime.parse(dateStr, formatter) } // 将日期格式化为文本 def formatDate(date: LocalDateTime, pattern: String): String = { val formatter = DateTimeFormatter.ofPattern(pattern) date.format(formatter) } }
SBT依赖配置:
- JVM端:
libraryDependencies += "io.github.cquiroz" %% "scala-java-time" % "2.5.0"
- JS端:
libraryDependencies += "io.github.cquiroz" %%% "scala-java-time" % "2.5.0"
2. 自定义抽象层+平台专属实现
如果不想引入第三方库,可以通过定义共享接口,再分别在JVM和JS端实现具体逻辑:
共享代码(定义接口):
trait DateHandler { def parse(dateStr: String, pattern: String): java.util.Date def format(date: java.util.Date, pattern: String): String } // 共享业务逻辑 object DateService { def parse(handler: DateHandler, dateStr: String, pattern: String): java.util.Date = handler.parse(dateStr, pattern) def format(handler: DateHandler, date: java.util.Date, pattern: String): String = handler.format(date, pattern) }
JVM端实现:
class JvmDateHandler extends DateHandler { override def parse(dateStr: String, pattern: String): java.util.Date = { val sdf = new java.text.SimpleDateFormat(pattern) sdf.parse(dateStr) } override def format(date: java.util.Date, pattern: String): String = { val sdf = new java.text.SimpleDateFormat(pattern) sdf.format(date) } }
JS端实现:
import scala.scalajs.js class JsDateHandler extends DateHandler { override def parse(dateStr: String, pattern: String): java.util.Date = { // 根据pattern适配JS Date解析逻辑,复杂格式需额外处理 val jsDate = new js.Date(dateStr) new java.util.Date(jsDate.getTime().toLong) } override def format(date: java.util.Date, pattern: String): String = { // 利用JS的Intl.DateTimeFormatter实现格式化,需将Java pattern映射为JS配置 val jsDate = new js.Date(date.getTime()) // 示例:简化处理,实际需根据pattern转换配置 jsDate.toLocaleString() } }
这种方式需要手动处理不同平台的API差异和格式映射,适合对依赖有严格限制的场景。
内容的提问来源于stack exchange,提问作者pme
相关产品推荐
相关产品推荐

