new Date() Scheduled 脚本返回 UTC 而不是本地时间

new Date() Scheduled Script returning UTC not local time

我的库中有一个函数可以return当前日期:

function currentDate(addDays) {
    if (addDays == null||addDays == undefined) { 
        addDays = 0; 
    }
    var currentdate = new Date();
    var current = nlapiAddDays(currentdate,addDays);
    var day = current.getDate();
    var month = current.getMonth()+1
    var year = current.getFullYear();
    return day+'/'+month+'/'+year;
}

一切正常,直到我 运行 一个使用此功能的预定脚本,此时 returned 日期是 UTC,而不是我们的本地时间。在这个函数中是否有一种简单的转换方法不需要外部库?

这是我使用多年的 utils 函数。

function getCompanyDate(){
    var currentDateTime = new Date();
    var companyTimeZone = nlapiLoadConfiguration('companyinformation').getFieldText('timezone');
    var timeZoneOffSet = (companyTimeZone.indexOf('(GMT)') == 0) ? 0 : new Number(companyTimeZone.substr(4, 6).replace(/\+|:00/gi, '').replace(/:30/gi, '.5'));
    var UTC = currentDateTime.getTime() + (currentDateTime.getTimezoneOffset() * 60000);
    var companyDateTime = UTC + (timeZoneOffSet * 60 * 60 * 1000);

    return new Date(companyDateTime);
}

它使用贵公司的 NetSuite 设置和时区。假设您的 NetSuite 设置正确,这将 return 正确时区的日期。

然后你基本上可以做:

function currentDate(addDays) {
if (addDays == null||addDays == undefined) { 
    addDays = 0; 
}
var currentdate = getCompanyDate();
var current = nlapiAddDays(currentdate,addDays);
var day = current.getDate();
var month = current.getMonth()+1
var year = current.getFullYear();
return day+'/'+month+'/'+year;
}

这就是我所做的,但是您需要消耗使用单位,因为您必须创建记录。

首先,我创建了一个隐藏的自定义 Date/Time 字段。然后我使用下面的代码。

var record = nlapiCreateRecord(<recordtype>);
record.setDateTimeValue(<fieldid>, nlapiDateToString(new Date(), 'datetimetz', 5);
var userDateTime = record.getFieldValue(<fieldid>); 

变量 userDateTime 现在应该在本地时区。

nlapiSetDateTimeValue() API 函数会将 date/time 值转换为用户的时区。下面是它的语法:

nlapiSetDateTimeValue(fieldId, dateTime, timeZone)

  1. fieldId = date/time 字段的 ID。
  2. dateTime = 要转换的日期值。
  3. timeZone = 传递日期的时区。如果它是服务器端脚本,它通常在太平洋地区,所以我们传递 Olson 值 5。

@lez-yeoh getCompanyDate 的 Suitescript 2.0 版本

function getCompanyDate(){
    var currentDateTime = new Date();
    var companyTimeZone = config.load({ type: config.Type.COMPANY_INFORMATION }).getText({ fieldId: 'timezone' });
    var timeZoneOffSet = (companyTimeZone.indexOf('(GMT)') == 0) ? 0 : Number(companyTimeZone.substr(4, 6).replace(/\+|:00/gi, '').replace(/:30/gi, '.5'));
    var UTC = currentDateTime.getTime() + (currentDateTime.getTimezoneOffset() * 60000);
    var companyDateTime = UTC + (timeZoneOffSet * 60 * 60 * 1000);

    return new Date(companyDateTime);
}