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

如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.28 15:38:11