moment.js无法转换部分月份日期至MySQL格式求助
问题:Moment.js转换特定月份日期失败,返回Invalid date
我正在使用适配Bootstrap 4的datetimepicker,之前用LLLL格式展示日期一切正常,但在把日期转换为MySQL需要的YYYY-MM-DD HH:mm:ss格式时,发现1月、3月、5月、12月的日期会转换失败,返回Invalid date,其他月份则完全正常。
问题复现示例
以下是测试输出:
a = Donnerstag, 4. Mai 2017 09:00 Zeit Datenbank ist adb: Invalid date b = Donnerstag, 13. April 2017 09:00 Zeit Datenbank ist bdb: 2017-04-13 09:00:00
我使用的核心代码如下:
var a = document.getElementById("datetimepicker_start").value; // 读取结果:a = Donnerstag, 7. Februar 2019 12:53 var adb = moment(a).format("YYYY-MM-DD HH:mm:ss"); // 部分月份返回Invalid date
问题原因
这是因为Moment.js在解析本地化日期字符串时,默认依赖系统环境的语言设置,而且如果日期字符串中的月份是德语缩写/全称(比如Mai、Januar),但你的Moment实例没有加载对应的德语语言包,或者解析时没有指定正确的语言格式,就会导致解析失败。
你遇到问题的月份(1月Januar、3月März、5月Mai、12月Dezember)都是德语的月份名称,而Moment.js默认是英文环境,无法识别这些德语月份,所以解析失败;而其他月份的德语名称可能刚好和英文有重叠(比如April),所以能正常解析。
解决方案
有两种可靠的解决办法:
方法1:加载并指定德语语言包
- 首先引入Moment.js的德语语言包(如果还没引入):
<script src="moment/locale/de.js"></script>
- 在解析日期时,明确指定使用德语本地化解析:
// 全局设置德语为默认语言 moment.locale('de'); // 或者在解析单个日期时指定语言规则 var adb = moment(a, 'LLLL', 'de').format("YYYY-MM-DD HH:mm:ss");
指定第三个参数'de'可以强制Moment用德语规则解析日期字符串,避免依赖系统环境的不确定性。
方法2:直接从datetimepicker获取格式化后的日期(更推荐)
datetimepicker本身支持直接输出特定格式的日期,不需要手动解析字符串,这样更可靠:
// 假设你的datetimepicker实例是通过jQuery初始化的 var adb = $('#datetimepicker_start').datetimepicker('viewDate').format('YYYY-MM-DD HH:mm:ss');
这种方法跳过了字符串解析的步骤,直接从组件的Date对象获取并格式化,完全避免了本地化解析的问题。
内容的提问来源于stack exchange,提问作者0xSilent
相关产品推荐
相关产品推荐

