跳转至

时间计算

本文档内容来源于 http://doc.myapps.cn/docs/common-script/common-script-1f1a43lh6snlt

脚本说明

该脚本用于进行时间计算,包括日期加减、日期差计算、日期格式化等操作。在MyApps平台中,可以使用JavaScript的Date对象或Java的日期类进行时间计算。

常见实现方式

方式1:日期加减(加天数)

(function(){
    var date = new Date();
    var days = 7;  // 加7天

    date.setDate(date.getDate() + days);

    return format(date, "yyyy-MM-dd");
})();

方式2:日期加减(减天数)

(function(){
    var date = new Date();
    var days = 7;  // 减7天

    date.setDate(date.getDate() - days);

    return format(date, "yyyy-MM-dd");
})();

方式3:日期加减(加月份)

(function(){
    var date = new Date();
    var months = 1;  // 加1个月

    date.setMonth(date.getMonth() + months);

    return format(date, "yyyy-MM-dd");
})();

方式4:日期加减(加年份)

(function(){
    var date = new Date();
    var years = 1;  // 加1年

    date.setFullYear(date.getFullYear() + years);

    return format(date, "yyyy-MM-dd");
})();

方式5:计算两个日期的天数差

(function(){
    var date1 = new Date("2024-01-01");
    var date2 = new Date("2024-12-31");

    var diffTime = Math.abs(date2.getTime() - date1.getTime());
    var diffDays = Math.ceil(diffTime / (1000 * 60 * 60 * 24));

    return diffDays;  // 返回天数差
})();

扩展示例

示例1:计算工作日(排除周末)

(function(){
    var startDate = new Date("2024-01-01");
    var endDate = new Date("2024-01-31");
    var workDays = 0;

    var currentDate = new Date(startDate);

    while(currentDate <= endDate){
        var dayOfWeek = currentDate.getDay();
        // 0是周日,6是周六
        if(dayOfWeek != 0 && dayOfWeek != 6){
            workDays++;
        }
        currentDate.setDate(currentDate.getDate() + 1);
    }

    return workDays;
})();

示例2:计算时间差(小时、分钟、秒)

(function(){
    var date1 = new Date("2024-01-01 10:00:00");
    var date2 = new Date("2024-01-01 15:30:45");

    var diffTime = date2.getTime() - date1.getTime();

    var hours = Math.floor(diffTime / (1000 * 60 * 60));
    var minutes = Math.floor((diffTime % (1000 * 60 * 60)) / (1000 * 60));
    var seconds = Math.floor((diffTime % (1000 * 60)) / 1000);

    return hours + "小时" + minutes + "分钟" + seconds + "秒";
})();

示例3:计算年龄

(function(){
    var birthDate = new Date("1990-01-01");
    var today = new Date();

    var age = today.getFullYear() - birthDate.getFullYear();
    var monthDiff = today.getMonth() - birthDate.getMonth();

    if(monthDiff < 0 || (monthDiff === 0 && today.getDate() < birthDate.getDate())){
        age--;
    }

    return age;
})();

示例4:计算本月天数

(function(){
    var date = new Date();
    var year = date.getFullYear();
    var month = date.getMonth() + 1;

    // 获取下个月的第一天,然后减1天,得到本月的最后一天
    var lastDay = new Date(year, month, 0);

    return lastDay.getDate();
})();

示例5:计算季度

(function(){
    var date = new Date();
    var month = date.getMonth() + 1;
    var quarter = Math.ceil(month / 3);

    return "第" + quarter + "季度";
})();

示例6:计算周数

(function(){
    var date = new Date();
    var startDate = new Date(date.getFullYear(), 0, 1);
    var days = Math.floor((date - startDate) / (24 * 60 * 60 * 1000));
    var weekNumber = Math.ceil((days + startDate.getDay() + 1) / 7);

    return weekNumber;
})();

示例7:计算日期范围(本周)

(function(){
    var today = new Date();
    var dayOfWeek = today.getDay();
    var diff = today.getDate() - dayOfWeek + (dayOfWeek == 0 ? -6 : 1);  // 调整到周一

    var monday = new Date(today.setDate(diff));
    var sunday = new Date(today.setDate(diff + 6));

    var range = {
        start: format(monday, "yyyy-MM-dd"),
        end: format(sunday, "yyyy-MM-dd")
    };

    return JSON.stringify(range);
})();

示例8:计算日期范围(本月)

(function(){
    var today = new Date();
    var year = today.getFullYear();
    var month = today.getMonth();

    var firstDay = new Date(year, month, 1);
    var lastDay = new Date(year, month + 1, 0);

    var range = {
        start: format(firstDay, "yyyy-MM-dd"),
        end: format(lastDay, "yyyy-MM-dd")
    };

    return JSON.stringify(range);
})();

示例9:计算日期范围(本季度)

(function(){
    var today = new Date();
    var year = today.getFullYear();
    var month = today.getMonth();
    var quarter = Math.floor(month / 3);

    var quarterStartMonth = quarter * 3;
    var quarterEndMonth = quarterStartMonth + 2;

    var firstDay = new Date(year, quarterStartMonth, 1);
    var lastDay = new Date(year, quarterEndMonth + 1, 0);

    var range = {
        start: format(firstDay, "yyyy-MM-dd"),
        end: format(lastDay, "yyyy-MM-dd")
    };

    return JSON.stringify(range);
})();

示例10:计算相对时间(如:3天前、2小时后)

(function(){
    var date = new Date();
    var days = 3;  // 3天前

    date.setDate(date.getDate() - days);

    return format(date, "yyyy-MM-dd HH:mm:ss");
})();

示例11:使用Java Calendar进行时间计算

(function(){
    var Calendar = Packages.java.util.Calendar;
    var SimpleDateFormat = Packages.java.text.SimpleDateFormat;

    var calendar = Calendar.getInstance();
    calendar.add(Calendar.DAY_OF_MONTH, 7);  // 加7天

    var sdf = new SimpleDateFormat("yyyy-MM-dd");
    var result = sdf.format(calendar.getTime());

    return result;
})();

示例12:计算两个日期之间的所有日期

(function(){
    var startDate = new Date("2024-01-01");
    var endDate = new Date("2024-01-05");
    var dates = [];

    var currentDate = new Date(startDate);

    while(currentDate <= endDate){
        dates.push(format(currentDate, "yyyy-MM-dd"));
        currentDate.setDate(currentDate.getDate() + 1);
    }

    return JSON.stringify(dates);
})();

关键函数说明

JavaScript Date对象

  • new Date(): 创建当前日期时间对象
  • date.getTime(): 获取时间戳(毫秒)
  • date.getFullYear(): 获取年份
  • date.getMonth(): 获取月份(0-11)
  • date.getDate(): 获取日期(1-31)
  • date.getDay(): 获取星期(0-6,0是周日)
  • date.setDate(date): 设置日期
  • date.setMonth(month): 设置月份
  • date.setFullYear(year): 设置年份
  • format(date, "格式"): 格式化日期

Java日期类

  • Packages.java.util.Calendar: Java日历类
  • Calendar.getInstance(): 获取Calendar实例
  • calendar.add(field, amount): 日期加减
  • calendar.getTime(): 获取Date对象
  • Packages.java.text.SimpleDateFormat: 日期格式化类

时间计算说明

日期加减

  • 加天数: date.setDate(date.getDate() + days)
  • 加月份: date.setMonth(date.getMonth() + months)
  • 加年份: date.setFullYear(date.getFullYear() + years)
  • 加小时: date.setHours(date.getHours() + hours)
  • 加分钟: date.setMinutes(date.getMinutes() + minutes)

日期差计算

  • 天数差: (date2.getTime() - date1.getTime()) / (1000 * 60 * 60 * 24)
  • 小时差: (date2.getTime() - date1.getTime()) / (1000 * 60 * 60)
  • 分钟差: (date2.getTime() - date1.getTime()) / (1000 * 60)

日期格式化

  • yyyy-MM-dd: 年-月-日
  • yyyy-MM-dd HH:mm:ss: 年-月-日 时:分:秒
  • yyyy年MM月dd日: 中文格式

注意事项

  • ⚠️ 月份索引: JavaScript中月份从0开始(0-11),注意加1
  • ⚠️ 星期索引: JavaScript中星期从0开始(0是周日)
  • ⚠️ 时区问题: 注意时区差异,可能影响计算结果
  • ⚠️ 闰年处理: 2月份的天数需要考虑闰年
  • ⚠️ 日期有效性: 确保日期格式正确,避免无效日期
  • ⚠️ 性能考虑: 大量日期计算时注意性能优化
  • 日期加减时注意月份和年份的边界情况
  • 计算日期差时注意正负值
  • 建议使用format函数格式化日期输出

使用场景

  • 日期范围查询
  • 到期时间计算
  • 工作日计算
  • 年龄计算
  • 时间差统计
  • 报表日期范围

如需查看完整脚本代码,请访问源文档链接。