Huy*_*man 7 javascript datetime
这是我的问题:
我正在尝试计算从今天的日期过去了多少天并将其显示在标签中。问题是当用户更改时间时,我得到的结果是分数。
请协助
这是我在 JS 中的代码:
//=============================================== //
// How many days passed from the current day //
// ============================================ //
function BanDateChanged(sender, args) {
var banDate = $find("<%= rdtpBan.ClientID %>");
var TodayDate = new Date();
var today = new Date();
var todayFormat = new Date(today.getMonth() + 1 + "/" + today.getDate() + "/" + today.getFullYear());
var banSelectedDate = banDate.get_selectedDate();
var countedBannedDays = document.getElementById("<%= lblBanCountDays.ClientID %>");
var one_day = 1000 * 60 * 60 * 24;
var countedDays = (Math.ceil(todayFormat - banSelectedDate) / one_day);
if (countedDays == 0) {
countedBannedDays.innerHTML = "";
} else {
countedBannedDays.innerHTML = countedDays + " Days ago";
}
}
Run Code Online (Sandbox Code Playgroud)
传统上,这个任务和许多类似的任务是通过一遍又一遍地重新发明相同的解决方案来解决的,这会导致开发过程中出现像您在这里遇到的问题,并为未来留下可维护性的噩梦。
幸运的是,有一个小型库可用于此类情况:Moment.js。
要显示自给定日期以来已经过去了多少天:
var days = moment().diff("2015-06-02", "days");
Run Code Online (Sandbox Code Playgroud)
它为您处理舍入,它处理夏令时边界,它处理时区,它为您处理日期格式解析等等 - 实际上没有必要重新发明轮子并多次编写相同的代码。请参阅:演示。
但它甚至比这更好:
你可以用这个代替:
var ago = moment.duration(moment().diff("2015-06-05")).humanize() + " ago";
Run Code Online (Sandbox Code Playgroud)
您将自动获得如下值:
"15 days ago""13 hours ago""5 years ago"这将准备好为countedBannedDays.innerHTML您的用户提供更多信息价值。请参阅:演示。
在您的示例中,只要您的值banSelectedDate包含有效日期,那么您的代码 - 删除 DOM 处理代码,因为它将保持不变:
var banDate = $find("<%= rdtpBan.ClientID %>");
var TodayDate = new Date();
var today = new Date();
var todayFormat = new Date(today.getMonth() + 1 + "/" + today.getDate() + "/" + today.getFullYear());
var banSelectedDate = banDate.get_selectedDate();
var one_day = 1000 * 60 * 60 * 24;
var countedDays = (Math.ceil(todayFormat - banSelectedDate) / one_day);
Run Code Online (Sandbox Code Playgroud)
可以简化为:
var banDate = $find("<%= rdtpBan.ClientID %>");
var banSelectedDate = banDate.get_selectedDate();
var countedDays = moment().diff(banSelectedDate, "days");
Run Code Online (Sandbox Code Playgroud)
相关天数计算逻辑如下:
var countedDays = moment().diff(banSelectedDate, "days");
很明显发生了什么,您不必处理奇怪的边缘情况,您可以避免暴露内部数据表示导致抽象泄漏,而且实际上没有太多犯错误的空间。
还有其他库:
请参阅此答案中的更多信息。
有了好的库来处理此类常见任务,我们就不必编写具有许多潜在问题的复杂代码,就像您在这里遇到的问题一样。代码重用不仅可以让您避免潜在的问题,还可以使您自己的代码更易于维护。