angular - 将 NgbDate 转换为 moment 以进行格式化:第一个月分配为 0 vs 1 的问题
问题描述
我有一个允许范围选择的 Ngb-Datepicker。我正在使用 moment.js 将 NgbDate 转换为 moment 对象,以便我可以根据需要转换和输出格式:例如。1月23日星期三。
我意识到 NgbDates 给一月一个值,而时刻给一月一个 0,所以我曾经myMoment.subtract(1, 'months')
解决这个问题(在一个月后输出日期之前)。
我现在的问题是那一刻仍然将原始月份的天数视为相同。因此,当我尝试选择从 1 月 1 日到 1 月 31 日的日期范围时,它不起作用,因为 28 日之后的任何内容都是无效的。
仍然可以选择 29-31 日,但是当我尝试使用该formatDate()
函数输出它时,它被视为无效日期,因为时刻仍将其视为下个月(2 月) - 你会看到“ to:" 底部的标签不会添加日期。
Stackblitz: https ://stackblitz.com/edit/angular-xtrvjr?file=app%2Fdatepicker-range.ts
日期转换功能:
// Convert date to "Mon Feb 01" format
formatDate(date: NgbDate) {
const myMoment: moment.Moment = moment(date);
// NgbDates use 1 for Jan, Moement uses 0, must substract 1 month for proper date conversion
var convertedMoment = myMoment.subtract(1, 'months');
if (convertedMoment.isValid()) {
return convertedMoment.format('ddd MMM DD');
} else {
return '';
}
}
使用该功能的模板:
发件人:{{ formatDate(fromDate) }}
收件人:{{ formatDate(toDate) }}
解决方案
我想出了一个解决方案。该formatDate
函数现在将 NgbDate 转换为 JSON,从 JSON 创建一个新对象,并moment()
在从月份减去 1 后使用它手动将值传递给一个新对象。
示例:https ://stackblitz.com/edit/angular-xtrvjr-zkopwv
修复功能:
formatDate(date: NgbDate) {
// NgbDates use 1 for Jan, Moement uses 0, must substract 1 month for proper date conversion
var ngbObj = JSON.parse(JSON.stringify(date));
var newMoment = moment();
if (ngbObj) {
ngbObj.month--;
newMoment.month(ngbObj.month);
newMoment.dates(ngbObj.day);
newMoment.year(ngbObj.year);
}
// Convert date to "Mon Feb 01" format
if (newMoment.isValid()) {
return newMoment.format('ddd MMM DD');
} else {
return '';
}
}
推荐阅读
- haskell - 如何使用可能从列表中获取元素
- sql - 在客户没有电子邮件地址的情况下交叉应用
- c# - 我无法让 GridControl 中的按钮执行操作
- android - onClickListener 和 Json 对象
- openedx - 如何更改我的opensx平台名称?
- android - Google Fit - 与 Google Play 服务的连接丢失
- c# - 在 word addin 中查找并突出显示问题
- oracle - Oracle OCCI 无法正确检索小数点后的值
- c++ - 无法在 Visual Studio 和 vcpkg 中构建 cmake 项目(致命错误 C1083)
- angular - 在 ionic 3 中将 QR 码发送到电子邮件