将 java 日期时间符号转换为 javascript 库日期时间符号
Posted
技术标签:
【中文标题】将 java 日期时间符号转换为 javascript 库日期时间符号【英文标题】:Convert java datetime symbols to javascript libaries datetime symbols 【发布时间】:2021-11-18 11:10:17 【问题描述】:我的后端是使用 java 构建的,用户设置 API 返回日期时间格式,以使用 Java 标准在视图中使用(日期时间稍后在 ISO8601 中返回并即时格式化)。 Java 'yyyy-MM-dd' 中的示例应转换为 'YYYY-MM-DD' 以与 javascript 的库 momentjs 一起使用。
有没有直接的方法将符号从 java 转换为 javascript 库(momentjs 或 date-fns)?
【问题讨论】:
如果服务器和客户端可能位于不同的时区,并且该日期时间应显示在用户本地的时区中,那么我建议不要将其作为字符串发送,而是发送UTC 时间戳,客户端可以正常显示。 这已经通过发送带有 UTC 的 ISO8601 日期时间来处理。谢谢 我是否正确理解您想以某种方式自动转换格式/模式字符串? “javascript 日期时间令牌”到底是什么意思?Date
对象?
@Hulk 是的。将docs.oracle.com/javase/8/docs/api/java/time/format/…"Patterns for Formatting and Parsing" 翻译成对应的 Javascript。
【参考方案1】:
momentjs 有自己特定的格式符号,这让人困惑,而其他库(如 date-fns)则遵循 LDML 标准。我最终使用了 date-fns,因为 Java 具有相同的标准。
https://date-fns.org/v2.26.0/docs/Unicode-Tokens
https://www.unicode.org/reports/tr35/tr35-dates.html#Date_Field_Symbol_Table
【讨论】:
您也可以使用JS-Joda,它是 Java 8 日期和时间 API (JSR 310) 的一个端口。我敢打赌他们使用的是相同的模式字母。【参考方案2】:这将是一个非常棒的手持操作。此外,您可能无法涵盖所有情况,但肯定是最常见的情况。以下内容应该可以帮助您入门。
function replacer(match, offset, string)
switch (match)
case 'M': return 'M';
case 'MM': return 'MM';
case 'MMM': return 'MMM';
case 'MMMM': return 'MMMM';
case 'd': return 'D';
case 'dd': return 'DD';
case 'D': return 'DDD';
case 'DDD': return 'DDDD';
case 'yy': return 'YY';
case 'yyyy': return 'YYYY';
default: return '(not supported)';
var javaPattern = 'yyyy-MM-dd';
var regEx = /([a-z]+)/g;
var javaScriptPattern = javaPattern.replace(regEx, replacer);
console.log(javaScriptPattern);
请仔细阅读下面两个链接中的 Java 模式字母和 JavaScript 模式字母,并根据需要在我的代码中展开翻译。
链接
Java 格式模式字母在the documetnation ofDateTimeFormatter
momentjs 格式模式字母在Format - momentjs.com
【讨论】:
tokeniser 必须比/([a-z]+)/
更聪明一点,因为标记之间的分隔符不是强制性的,例如yyyyMMdd。您需要一次收集一个字符,直到模式不再与标记匹配,例如this answer 中的解析器。 :-)
感谢您的回答,我想避免这样做。似乎 date-fns 等其他一些库遵循 Java 使用的 LDML 格式。 unicode.org/reports/tr35/…以上是关于将 java 日期时间符号转换为 javascript 库日期时间符号的主要内容,如果未能解决你的问题,请参考以下文章
如何将 Java 日期字符串/对象转换为 JFreeChart 日期格式?