【发布时间】:2016-06-15 19:02:16
【问题描述】:
有没有办法智能地查找 JavaScript 中特定 Date 对象在某个时间窗口(月、日、年、周)内的开始和结束时间?
我希望能够给它任何日期,然后是标识符(如月、周、日或年),然后是是否应该使用 UTC 时间的布尔值。它应该返回一个带有两个键(startTime、endTime)的 JavaScript 对象,其中这些键的值是代表我的范围的纪元毫秒(或日期对象)。
我开始编写一个函数来执行此操作(见下文),只是想知道是否有更聪明的方法来执行此操作:
/**
* @param rangeValue; String ('year', 'month', 'week', 'day')
* @param dateTime; JavaScript Date Object.
* @param useUTC; Boolean. Determines whether or not UTC is to be used or default browser time
* @returns {{}}; startTime and endTime, in epoch milliseconds
*/
function generateTimeRange(rangeValue, dateTime, useUTC) {
var dateRange = {};
var year = dateTime.getUTCFullYear();
var month = dateTime.getUTCMonth();
var dayOfWeek = dateTime.getUTCDay();
var day = dateTime.getUTCDate();
if (!useUTC) {
year = dateTime.getFullYear();
month = dateTime.getMonth();
dayOfWeek = dateTime.getDay();
day = dateTime.getDate();
}
if (rangeValue === 'year') {
dateRange.startTime = new Date(year, 0, 0, 0, 0, 0, 0).getTime();
dateRange.endTime = new Date(year + 1, 0, 0, 0, 0, 0, 0).getTime() - 1;
} else if (rangeValue === 'month') {
dateRange.startTime = new Date(year, month, 0, 0, 0, 0, 0).getTime();
month += 1;
if (month > 11)
year += 1;
dateRange.endTime = new Date(year + 1, month % 12, 0, 0, 0, 0, 0).getTime() - 1;
} else if (rangeValue === 'week') {
// Do week calculation
} else if (rangeValue === 'day' {
// Do day calculation
}
return dateRange;
}
编辑:刚刚发现 Moment.js 有 startOf 和 endOf 方法。没有外部库,有没有一种优雅的方法来做到这一点?
【问题讨论】:
-
在你做“开始”和“结束”之前,你需要定义它们是什么。例如。 ISO 周从星期一开始,美国周通常是星期日。周末可能是星期日 (ISO)、星期六 (美国) 或星期五(西部商业周)。有些文化的工作日是从周六到周三或周四,周五相当于西部周日。
-
请注意,
new Date(year, 0, 0, 0, 0, 0, 0)中的日期值应为 1,否则您将获得上一年的 12 月 31 日。 ;-)
标签: javascript date