NetSuite 日期格式与时区问题

在NetSuite中,由于存在客户端时间、服务器时间、个人首选项时区时间。在代码中如果没有区分好这几个时间,则在国际化项目中就会出现问题。我们就在近期的一个项目上进了这个坑。在中国时区的我们,让位于纽约的顾问看时间错误,他让巴基斯坦的外包顾问改代码。项目上这个时间Bug,我们日不落整了一大圈。

西老师给整了篇总结,加上实验,给大家谈谈这个事。

以下文字转自他的文章。
西老师《NS中日期格式与时区问题》

1. JS中的日期对象

JS日期对象中存储的两个重要信息:

  1. 毫秒数:相对1970/1/1 00:00:00 GMT 所经过的毫秒数
  2. 时区:本机时区(不可更改)

在这里插入图片描述

如果在两个时区设置不同的计算机上 new Date(), 那么日期对象中所存储的毫秒数相同,时区不同。

2. 使用NS时的不同时区

  1. 客户端时区,即NS用户操作的计算机的时区
  2. 服务器时区,即NS所在服务器上的时区
  3. 本机时区,当下文提到本机时区时,若代码运行在客户端,则本机时区为客户端时区,若代码运行在服务器端,本机时区为服务器时区
  4. NS时区,NS个人设置中的时区

在这里插入图片描述

在这里插入图片描述

3. N/format中当type为DATE、DATETIME的大致行为

  • format.format, type为DATE : 则value需要是Date对象,使用本机时区(即Date对象中存储的时区),NS个人设置中日期格式,输出日期字符串
  • format.parse, type为DATE : value需是与NS个人设置中日期格式相匹配的日期字符串,将其当作本机时区的时间,转为DATE对象
  • format.format,type为DATETIME : value需是Date对象,使用NS时区(不指定时区的默认行为),NS个人设置中的日期与时间格式,输出字符串,(12小时制时 “am/pm” "上午/下午"按个人设置中的语言输出)
  • format.parse,type为DATETIME : value需是与NS个人设置中日期与时间格式相匹配的日期+时间字符串,将其当作NS时区的时间(不指定时区的默认行为),转为DATE对象(12小时制时同样注意语言)

4. 字段类型“日期”、“日期/时间” 与 API “setValue”、“setText”

  • 字段类型“日期”:可以看作是存储了“年月日”三个值(便于理解,实际情况可能不同),展示时按个人设置的日期格式输出
  • 字段类型“日期/时间“:可以看作存储了一个Date对象且时区可变(便于理解,实际情况可能不同),展示时按NS时区,个人设置的日期与时间格式输出
  • 在字段中设置默认值为当前时间时,按NS时区给默认值

5. getText, getValue, setText, setValue用于 日期、日期/时间类型字段时的大致行为

  1. getText用于日期类型字段:取出年月日,按个人设置的日期格式输出
  2. getValue用于日期类型字段:将使用getText取出的字符串用format.parse转为日期对象输出
  3. setText用于日期类型字段:text需要是与个人设置中的日期格式相匹配的字符串,取出字符串中的年月日,设置到字段上
  4. setValue用于日期类型字段:value需是Date对象,使用format.format转为字符串后使用setText设置
  5. getValue用于日期/时间类型字段:直接取出日期对象
  6. getText用于日期/时间类型字段:取出日期对象后,使用format.format转为字符串
  7. setValue用于日期/时间类型字段:value为Date对象,直接设置到字段上
  8. setText用于日期/时间类型字段:text为格式匹配的日期时间字符串,使用format.parse转为日期对象,设置到字段上

6. search 中的日期与时间

  1. 格式化: TO_CHAR({date_or_datetime_field_id}, ‘YYYY-MM-DD hh24:mi:ss’), Sample Functions of TO_CHAR (custhelp.com)
    1. 日期字段格式化: 时分秒始终为0
    2. 日期/时间字段格式化:使用NS时区的时间
    3. {now}/{today}格式化:NS时区的当前时间
  2. 计算时间差: 日期,日期/时间类型的字段在公式中可以相减计算时间差
    1. 日期/时间类型 和 日期类型相减:结果为带符号的整数加时分秒
    2. 日期/时间类型 和日期/时间类型相减:结果为带符号的整数加时分秒
    3. 日期类型 和 日期类型相减:结果为带符号整数
    4. 日期类型和{now}/{today}/Date Created/Last Modified相减:结果为以天数换算的带符号小数

7. 实践

  1. 新建一个自定义记录,增加字段:
    1. 类型为日期,默认值为当前时间,下文用 custrecord_date 代表此字段id
    2. 类型为日期,默认值为当前时间,下文用custrecord_date2代表此字段id
    3. 类型为日期/时间,默认值为当前时间,下文用custrecord_datetime代表此字段id

在这里插入图片描述

  1. 建记录:
    1. 新建记录,使用默认值。
    2. 用schedule脚本建记录,用 setValue, value为new Date()设置custrecord_date字段
    3. 用client脚本建记录,用 setValue, value为new Date()设置custrecord_date2字段
    4. 观察有什么区别(一天中的不同时间,结果可能不同)
  2. 调整个人设置中的时区,重复2.

在这里插入图片描述

  1. 建记录:
    1. 新建记录,使用默认值。
    2. 用schedule脚本建记录,用setText, text为 ‘2021-06-06 06:06:06’(根据个人设置中日期与时间格式变化),设置custrecord_datetime
    3. 用client脚本,用setText, text为 ‘2021-06-06 06:06:06’(根据个人设置中日期与时间格式变化),设置custrecord_datetime
    4. 观察有什么区别

在这里插入图片描述

  1. 新建此记录类型的search , 结果中增加:

    1. custrecord_date
    2. formula text: TO_CHAR({custrecord_date}, “YYYY-MM-DD hh24:mi:ss”)
    3. custrecord_datetime
    4. formula text: TO_CHAR({custrecord_datetime}, “YYYY-MM-DD hh24:mi:ss”)
    5. Date Created
    6. formula text: TO_CHAR({created}, “YYYY-MM-DD hh24:mi:ss”)
    7. Last Modified
    8. formula text: {custrecord_date}-{custrecord_date2}
    9. formula text: {custrecord_date}-{custrecord_datetime}
    10. formula text: {now}-{custrecord_date}
    11. formula text: {now}-{custrecord_datetime}
    12. formula text: {created}-{custrecord_date}
    13. formula text: {created}-{custrecord_datetime}
  2. 查看结果, 更改个人设置中的时区,再次查看结果。

在这里插入图片描述

在这里插入图片描述

常见问题

  1. setValue设置时间用的值是js的日期对象,不能用字符串
  2. setText设置时间用的日期格式要与个人设置里一致,不同用户的个人设置可能不一样,要注意
  3. 时间格式里带am pm的话,会因语言不同而不同,使用时需注意,否则会报unexpected error
  4. 使用setValue设置日期时会因时区问题导致与预期不同
  5. 日期字段类型不随NS时区变化,日期/时间字段类型随NS时区变化,两者计算时间差会出问题
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值