(getDate() - 1)如果当前日期为1,则函数的值为零

时间:2016-09-07 04:11:25

标签: javascript date netsuite suitescript

我的要求:

我需要字段开始日期和结束日期,如果在保存记录时结束日期为空,则结束日期字段值将根据从日期输入的加1年填充。

我的问题:

如果开始日期为“9/1/2016”且结束日期为空左意味着它应自动将结束日期值填充为“8/31/2016”< / strong>但是将结束日期值返回为“9/0/2016”,而且我还得到以下错误消息

错误:JS_EXCEPTION INVALID_FLD_VALUE您为以下字段输入了无效字段值无效日期:custrecord_end_date

CODE: 脚本:客户端脚本,事件:SaveRecord

function saveRecord(scriptContext) {
  var newRecord= scriptContext.currentRecord;
 var fromDate = new Date(newRecord.getValue('custrecord_created_date'));
 var endDate = newRecord.getValue('custrecord_end_date');
   if (endDate == null || endDate == '') {
    //getting plus 1 year based on the From Date
    tempEndDate = addingPlusYearOfTheCurrentDate(fromDate);

   //setting the value to the End Date Field
     newRecord.setValue('custrecord_end_date', tempEndDate);

}
}
  // Add Plus Year from the Start Date when the End Date is Empty
        function addingPlusYearOfTheCurrentDate(fromDate ) {
            var date = new Date();
            var Month = (fromDate.getMonth() + 1);
            var Dates = (fromDate.getDate() - 1);
            var Year = (fromDate.getFullYear() + 1);
            var last_Day = new Date(Month + '/' + Dates + '/' + Year);


            log.debug('last_Day:', last_Day);
            return last_Day;
        }

4 个答案:

答案 0 :(得分:3)

不确定为什么您希望能够从1中减去1并获得0以外的任何值,但您可以使用Date对象的setFullYear()setDate()来解决此问题。

function addingPlusYearOfTheCurrentDate(fromDate) {
  var date = new Date(fromDate);

  date.setFullYear(date.getFullYear() + 1);
  date.setDate(date.getDate() - 1);

  return date;
}

console.log(addingPlusYearOfTheCurrentDate(new Date(2015, 10, 1)));

答案 1 :(得分:1)

使用Date构造函数解析字符串(和Date.parse,它们等同于解析)是推荐的,因为解析几乎完全取决于实现并且不一致。使用自定义函数手动解析字符串或使用库。

将一年添加到日期非常简单,但似乎您希望日期是明年同一天之前的一天。所以加一年然后减去一天。

&#13;
&#13;
// Parse m/d/y format string to a Date and validate the result
function parseMDY(s) {
  var b = s.split(/\D/);
  var d = new Date(b[2], --b[0], b[1]);
  return d && d.getMonth() == b[0]? d : new Date(NaN);
}
   
// Add 1 year to a Date
function addYear(d) {
  if (Object.prototype.toString.call(d) != '[object Date]') return;
  d.setFullYear(d.getFullYear() + 1);
  d.setDate(d.getDate() -1);
  return d;
}

var d = parseMDY('9/1/2016');
console.log(d.toLocaleString())
addYear(d);
console.log(d.toLocaleString())
&#13;
&#13;
&#13;

请注意,对于2月29日,将一年添加到5月1日,然后减去一天将给2月28日。

答案 2 :(得分:1)

您应该使用nlapiStringToDate()方法进行字符串到日期的转换,因为NetSuite会将日期字段值设为字符串,您必须将其转换为日期,并且在设置日期之前,必须使用nlapiSetFieldValue(YOUR_FIELD_ID, nlapiStringToDate(dateObject))

请参阅以下有关阅读和设置日期字段的建议用法。

function saveRecord(scriptContext) {
  var newRecord = scriptContext.currentRecord;
  var fromDate = nlapiStringToDate(newRecord.getValue('custrecord_created_date'));
  var endDate = nlapiStringToDate(newRecord.getValue('custrecord_end_date'));
  if (endDate == null || endDate == '') {
    //getting plus 1 year based on the From Date
    tempEndDate = addingPlusYearOfTheCurrentDate(fromDate);

   //setting the value to the End Date Field
     newRecord.setValue('custrecord_end_date', nlapDateToString(tempEndDate));
}

答案 3 :(得分:1)

这是1.0还是2.0脚本?

NetSuite的1.0 API提供了几种日期操作方法,可能对您有所帮助:nlapiAddMonthsnlapiAddDays,以及日期字符串转换方法。

以下是您在1.0

中可以做的一个示例
// 1.0 API does not pass scriptContext to saveRecord
function saveRecord() {

    // Use nlapiStringToDate instead of raw Date constructor
    var fromDate = nlapiStringToDate(nlapiGetFieldValue('custrecord_created_date'));

    // Instead of the full extra conditional, just use || as fallback
    var endDate = nlapiStringToDate(nlapiGetFieldValue('custrecord_end_date')) ||
            calculateEndDate(fromDate);

    // setting the value to the End Date Field
    nlapiSetFieldValue('custrecord_end_date', nlapiDateToString(endDate));
}

/** @param fromDate {Date} */
function addYear(fromDate) {
    return nlapiAddMonths(fromDate, 12);
}

/** @param fromDate {Date} */
function dayBefore(fromDate) {
    return nlapiAddDays(fromDate, -1);
}

/** @param startDate {Date} */
function calculateEndDate(startDate) {

    // add 1 year first, then subtract one day
    return dayBefore(addYear(startDate));
}

如果您正在使用2.0,只需添加评论,如果可以,我会尝试更新示例。如果您对此工作有任何疑问,请随时告诉我。