做跨境,你还不知道冬夏令时吗?

765 阅读5分钟

什么是冬夏令时?

要想了解什么是冬夏令时,首先得知道时区这个概念。由于地球是一个球体,且不停地自西向东自转,不同地区会在不同时间迎来日出日落,产生了地方时间的差异。为了统一时间标准,人们划分了时区,全球共分为 24 个时区,每个时区相差 1 小时。

冬夏令时是一种人为规定当地时间的制度,为了充分利用阳光,在夏季将时间调快,在冬季将时间调慢。详细点说,夏令时(Daylight Saving Time,简称 DST),也叫 “日光节约时制” 。在夏季,白昼时间较长,将时钟调快 1 小时,这样人们就能在天亮的时间里更早开始活动,减少夜间照明的使用,从而节约能源。例如,原本早上 7 点天亮,调快 1 小时后,原本的6点就变成了7点,人们 6 点就可以利用自然光线开始日常活动,减少对人工照明的依赖。实行夏令时的国家和地区,一般会在每年春季的某一天凌晨将时钟拨快 1 小时,到秋季再把时钟调回。

而冬令时则是在冬季将时间调慢,恢复到标准时间。冬季白昼时间较短,如果继续使用夏令时,人们可能需要在天还没亮的时候就开始活动,既不方便,也会增加照明和取暖的能源消耗。所以,当夏令时结束后,就会进入冬令时,把时钟调慢 1 小时,让人们在日出后开始一天的活动。

都知道,跨境电商的店铺管理员在中国,目标客户却分布全球,客户与管理员在不同的国家,不同的时区,而冬夏令时的存在让时间的差异更加复杂。比如,当中国处于正常时间时,美国部分地区可能正在实行夏令时,原本相差 12 个小时的时差,在夏令时期间可能就变成了 13 个小时。这对于跨境电商的运营来说是个不小的挑战,店铺管理员需要时刻留意不同地区的时间变化,才能更好地与全球客户沟通,安排商品上新、客服值班等工作,避免因时间差导致的沟通不畅或业务失误。 全球正在实行夏令时的城市和地区可参考:www.worldtime24.net/time/curren…

夏令时前端库——moment

时间的字符串格式

//输出带有时区(浏览器所在时区)的当前时间 
moment().format() 
moment().format("dddd, MMMM Do YYYY, h:mm:ss a"); // "'Thursday, May 22nd 2025, 11:26:07 pm'"
moment().format("ddd, hA");                       // "Thu, 11PM"
moment().format("[Today is] dddd");               // "Today is Thursday"

在moment官网的控制台可以打印不同格式的当前时间

image.png

时间戳

是指格林威治时间 1970 年 01 月 01 日 00 时 00 分 00 秒 (北京时间 1970 年 01 月 01 日 08 时 00 分 00 秒) 起至现在的总秒数。它是一个数字,本质上是对时间的一种量化表示,不依赖于任何特定的时区或时间表示方式,是一种全球统一的时间度量标准。

momnet().valueOf()

image.png

当前时间,全球各个时区的时间戳是一样的,相对于0时区的偏移量不同。

怎么判断某一时区的某一时间是否在冬夏令时?

借助moment库里的方法,先用moment.tz("浏览器时间",“时区”)方法,将浏览器时间转换成需要的时区对应的时间

moment.tz("2025-05-21T10:00:00", "Australia/Sydney").isDst() //如果不传入第二个表示时区的方法,就表示本机所在时区某一时间是否在夏令时 

具体场景应用

现在(2025-05-26 10:34:57)在中国(UTC+8东八时区)的商家,为阿姆斯特丹(UTC+1东一时区)的店铺新建一个活动,活动默认开始时间就是现在,结束时间在8h后,开始时间,结束时间的选择都是时间选择框组件,给接口传回两个字段,start_time:string, start_data: number(时间戳)。

image.png 时间转换逻辑:

mindmap
      开始
          1、获取现在时间,获取目标时区
            2、转换到目标时区的对应时间
              3、转换成组件接受的数据类型
                4、转换成接口接受的数据类型(string 与 number时间戳)
            
    

1、获取现在时间可以用moment().format("YYYY-MM-DD hh-mm-ss"),目标时区拿的是基座挂载在window的一个方法

2、用start_time=moment.tz('time',timezone).format("YYYY-MM-DD hh-mm-ss"),moment.tz来获取目标时区对应的时间(moment对象),zustand存储的数据是start_time:string, start_data: number(时间戳),两个时间选择框组件绑定的是start_time,end_time字段,继而还得用format方法获得字符串类型数据。

3、组件接受的数据也是字符串类型,就不需要转换了,但是需要做额外的数据校验(开始时间下拉面板当前时间之前的时间,结束时间的下拉面板小于开始时间的时间置灰),本篇不做详细赘述。

4、监听时间选择框的变化,更新zustand的数据,start_data= momentObj.unix()unix()方法得出的是10位的时间戳,精确到秒.

ending。。。希望xdm多多指教!!!