linux下调整时区和时间的方法

基础的 Date() 就不说了~ :  )

今天在写代码时遇到了更该时区的问题,虽然找到了时区缩写的表格,但是对时区缩写的来由却一知半解尤其是发现时区缩写中并没有PRC,于是在网上找了一下,发现这篇文章说得比较清楚,转过来

时区的修改:

如何获得某个月的天数?

不知道大家遇到过这个问题吗?我想如果你们写过日期组件一定有这个问题,我当时的解决方案是这样的:

以下的三个方法,month 参数我都根据 JS 本身对于 Date
的月份定义,采用0为1月

CST时间
Central Standard Time (USA) UT-6:00 美国标准时间
Central Standard Time (Australia) UT+9:30 澳大利亚标准时间
China Standard Time UT+8:00 中国标准时间
Cuba Standard Time UT-4:00 古巴标准时间

  鸡血:

最老实的办法

const EVERY_MONTH_DAYS = [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31];

function getDays(year, month) {
  if (month === 1 && isLeap(year)) return 29;
  return EVERY_MONTH_DAYS[month];
}

手动做了每个月天数的映射,如果是2月份并闰年,那天数+1

随便安利一个自己写的 osx
上的日历插件 

那没有更好的方法呢?手动 map 和闰年判断的逻辑没有就好了。

===============================================================

   
 CST:中国标准时间(China Standard Time),这个解释可能是针对RedHat
Linux。

稍微 diao 一点的办法

function getDays(year, month) {
  if (month === 1) return new Date(year, month, 29).getMonth() === 1 ? 29 : 28;
  return new Date(year, month, 31).getMonth() === month ? 31 : 30;
}

我们发现,new Date()的第三个参数是可以大于我们所知的每个月的最后一天的的,比如:

new Date(2016, 0, 200) //Mon Jul 18 2016 00:00:00 GMT+0800 (CST)

这样,我们就利用这个 JS
的特性,用29和31这两个关键点,去判断除了那个月的最后一天+1还是那个月吗?(其实28和30是关键点)。

一、时区   

    

再稍微 diao 一点的方法

function getDays(year, month) {
  return new Date(year, month + 1, 0).getDate();
}

new Date()的第三个参数传小于1的值会怎么样了,比如传0,我们就获得了上个月的最后一天,当然传负数也没问题:

new Date(2016, 0, -200) //Sun Jun 14 2015 00:00:00 GMT+0800 (CST)

PRC是时区的名称,它对应/usr/share/lib/zoneinfo下的PRC时区文件.CST是Chinese
Standard
Time的缩写,用在date命令的输出中.它是定义在PRC时区文件中.你看一下/usr/share/lib/zoneinfo/src下的asia文件就知道是怎么回事了.

    CST可以为如下4个不同的时区的缩写:
      美国中部时间:Central Standard Time (USA) UT-6:00

Date.prototype.各种String

具体的文档解释懒得再复制一下给大家看,参考链接:

这里主要和大家普及以下知识:

设置时区的方法是:
修改/etc/default/init文件的TZ=xxx,然后必须重起.xxx应该对应/usr/share/lib/zoneinfo中的一个文件.CTT 是Time zone 的ID, 而 CST
是Timezone的短显示名。但短显示名与ID的对应关系是一对多,
也就是说,同样使用短显示名CST的ID还有CST(这可是ID),即Central Standard
Time.

 

GMT(格林尼治平时)

格林尼治平时(又称格林尼治平均时间或格林尼治标准时间,旧译格林威治标准时间;英语:Greenwich
Mean
Time,GMT)是指位于英国伦敦郊区的皇家格林尼治天文台的标准时间,因为本初子午线被定义在通过那里的经线。

自1924年2月5日开始,格林尼治天文台每隔一小时会向全世界发放调时信息。

理论上来说,格林尼治标准时间的正午是指当太阳横穿格林尼治子午线时(也就是在格林尼治上空最高点时)的时间。由于地球在它的椭圆轨道里的运动速度不均匀,这个时刻可能与实际的太阳时有误差,最大误差达16分钟。

由于地球每天的自转是有些不规则的,而且正在缓慢减速,因此格林尼治时间已经不再被作为标准时间使用。现在的标准时间,是由原子钟报时的协调世界时(UTC)。

所以我们也从 MDN 上的文档看到对于toGMTString()的解释是:

Returns a string representing the Date based on the GMT (UT) time
zone. Use toUTCString() instead.

所以Wed Aug 28 15:05:59 CST
2002是正确的,因为时区是PRC,所以这里短显示名CST代表的ID是CTT。

      澳大利亚中部时间:Central Standard Time (Australia) UT+9:30

UTC(世界标准时间)

协调世界时,又称世界标准时间或世界协调时间,简称UTC(从英文「Coordinated
Universal Time」/法文「Temps Universel
Cordonné」而来),是最主要的世界时间标准,其以原子时秒长为基础,在时刻上尽量接近于格林尼治平时

二、时间

 

CST(北京时间)

北京时间,China Standard
Time,中国标准时间。在时区划分上,属东八区,比协调世界时早8小时,记为UTC+8。

不过这个CST这个缩写比较纠结的是它可以同时代表四个不同的时间:

  • Central Standard Time (USA) UT-6:00
  • Central Standard Time (Australia) UT+9:30
  • China Standard Time UT+8:00
  • Cuba Standard Time UT-4:00

插一个中国地区 JS
客户端时间和服务端时间不一致的问题

总结就是,前后端去传时间的时候,尽量都用 UTC 时间。

在不停止服务的情况下可以修改系统时间,用root用户登陆后修改。修改时间就用date命令就行.

      中国标准时间:China Standard Time UT+8:00

ISO 日期和时间的表示方法

if ( !Date.prototype.toISOString ) {
  ( function() {

    function pad(number) {
      if ( number < 10 ) {
        return '0' + number;
      }
      return number;
    }

    Date.prototype.toISOString = function() {
      return this.getUTCFullYear() +
        '-' + pad( this.getUTCMonth() + 1 ) +
        '-' + pad( this.getUTCDate() ) +
        'T' + pad( this.getUTCHours() ) +
        ':' + pad( this.getUTCMinutes() ) +
        ':' + pad( this.getUTCSeconds() ) +
        '.' + (this.getUTCMilliseconds() / 1000).toFixed(3).slice(2, 5) +
        'Z';
    };

  }() );
}

通过 Polyfill 我们就能知道 ISO
是怎么表示时间的,最主要的特征是最后一位是“Z”,然后表示的总是 UTC 时间。

格式为:date mmddHHMMYYYY.SS,月日时分年.秒。

 

额外的补充

 

      古巴标准时间:Cuba Standard Time UT-4:00

.valueOf() 和 .getTime()

.valueOf()的功能和.getTime()一样。

该方法通常在 JavaScript
内部被调用,而不是在代码中显式调用。什么意思?没有 valueOf,那么Date的实例是不能进行运算的。

var obj = Object.create(null);
obj + 1; // Uncaught TypeError: Cannot convert object to primitive value(…)

 

 

.toJSON

直接看这个 API 的名字的时候,我以为会返回一个 JSON
格式的字符串,但其实是这么一个东西

new Date().toJSON() // "2016-05-05T06:03:28.130Z"

其实是这么回事

JSON.stringify(new Date()) // ""2016-05-05T06:06:02.615Z""

那结果能够被 parse 吗?

JSON.parse(JSON.stringify(new Date())) // "2016-05-05T06:19:24.766Z"
JSON.parse('"' + new Date().toJSON() + '"') // "2016-05-05T06:19:24.766Z"

但是结果只是字符串而已。需要再讲这个字符串交给 new Date() 才行。

三、

    UTC:协调世界时,又称世界标准时间,简称UTC,从英文国际时间/法文协调时间”Universal
Time/Temps
Cordonné”而来。中国大陆、香港、澳门、台湾、蒙古国、新加坡、马来西亚、菲律宾、澳洲西部的时间与UTC的时差均为+8,也就是UTC+8。

.toLocaleFormat()

不属于任何标准。在JavaScript 1.6中被实现。似乎也只有 Firefox 自持这个
API,其实正确姿势是用.toLocaleDateString()

为什么用date命令时显示时区为CST?如:

 

.toLocale各种String()

.toLcale各种String(locales [, options]])

妈的这个 API 有点烦,看 MDN 的文档你就知道。这个 API
是用来本地化时间的。

这里稍微说下我对这些参数的理解:

 

    
GMT:格林尼治标准时间(旧译格林威治平均时间或格林威治标准时间;英语:Greenwich
Mean
Time,GMT)是指位于英国伦敦郊区的皇家格林尼治天文台的标准时间,因为本初子午线被定义在通过那里的经线。

locales

var date = new Date(Date.UTC(2012, 11, 20, 3, 0, 0));

// formats below assume the local time zone of the locale;
// America/Los_Angeles for the US

// US English uses month-day-year order
alert(date.toLocaleString("en-US"));
// → "12/19/2012, 7:00:00 PM"

// British English uses day-month-year order
alert(date.toLocaleString("en-GB"));
// → "20/12/2012 03:00:00"

// Korean uses year-month-day order
alert(date.toLocaleString("ko-KR"));
// → "2012. 12. 20. 오후 12:00:00"

// Arabic in most Arabic speaking countries uses real Arabic digits
alert(date.toLocaleString("ar-EG"));
// → "٢٠‏/١٢‏/٢٠١٢ ٥:٠٠:٠٠ ص"

// for Japanese, applications may want to use the Japanese calendar,
// where 2012 was the year 24 of the Heisei era
alert(date.toLocaleString("ja-JP-u-ca-japanese"));
// → "24/12/20 12:00:00"

// when requesting a language that may not be supported, such as
// Balinese, include a fallback language, in this case Indonesian
alert(date.toLocaleString(["ban", "id"]));
// → "20/12/2012 11.00.00"

locales所指的地区的时区和语言输出。

 

  如何查看系统的时区:

options

  • localeMatcher 选择本地匹配的什么算法,似乎没什么大用
  • timeZone 再设置下 UTC 时区
  • hour12 是否12小时制
  • formatMatcher 各日期时间单元的格式化
    • weekday Possible values are "narrow", "short", "long".
    • era Possible values are "narrow", "short", "long".
    • year Possible values are "numeric", "2-digit".
    • month Possible values
      are "numeric", "2-digit", "narrow", "short", "long".
    • day Possible values are "numeric", "2-digit".
    • hour Possible values are "numeric", "2-digit".
    • minute Possible values are "numeric", "2-digit".
    • second Possible values are "numeric", "2-digit".
    • timeZoneName Possible values are "short", "long".

栗子:

var date = new Date(Date.UTC(2012, 11, 20, 3, 0, 0));

date.toLocaleString("en-US", {hour12: false}); // "12/19/2012, 19:00:00"

var options = {timeZoneName:'long',weekday: "long", year: "2-digit", month: "narrow", day: "numeric"};
date.toLocaleString("en-US", options); // "Thursday, D 20, 12, China Standard Time"

插一个JavaScript 显示 Y-m-d H:i:s
的日期时间格式

 

  

老实的方法

let date = new Date();
let result = [
  [
    date.getFullYear(),
    date.getMonth() + 1,
    date.getDate()
  ].join('-'),
  [
    date.getHours(),
    date.getMinutes(),
    date.getSeconds()
  ].join(':')
].join(' ').replace(/bdb/g, '0$&');

代码:

[root@iZ280vf4sdpZ ~]# date
Sun Jan 15 22:45:48 CST 2017

diao 一点的方法

var date = new Date();
var result = date.toLocaleString('zh-CN', { hour12: false })
  .replace(///g, '-').replace(/bdb/g, '0$&');

 

一些有用的时间库

$dateThu Dec 22 08:50:55 CST 2005

  CST 就是代表时区


  时区的修改:

而我的时区是设为上海的:

  

代码:

 


 

$cat /etc/timezoneAsia/Shanghai

  1) 找到相应的时区文件
/usr/share/zoneinfo/Asia/Shanghai,用这个文件替换当前的/etc/localtime文件。


  

localtime也是指向的上海:

cp   /usr/share/zoneinfo/Asia/Shanghai /etc/localtime

代码:

  2) 修改/etc/sysconfig/clock文件,修改为:


   

/etc$ ll localtimelrwxrwxrwx  1 root root 33 Aug 11 21:37 localtime -> /usr/share/zoneinfo/Asia/Shanghai

ZONE="Asia/Shanghai"
UTC=false
ARC=false

  

    CST – 中国标准时间 
   CST – 美国中部标准时间  

  

1、GMT(Greenwich Mean Time)格林威治标准时间
英国伦敦的本地时间。
2、UTC(Universal Time Coordinated)通用协调时,同UT
UTC与格林威治标准时间(GMT, Greenwich Mean
Time)一样,都与英国伦敦的本地时相同。
3、CST时间
Central Standard Time (USA) UT-6:00 美国标准时间
Central Standard Time (Australia) UT+9:30 澳大利亚标准时间
China Standard Time UT+8:00 中国标准时间
Cuba Standard Time UT-4:00 古巴标准时间
通过Java获取的CST时间用的是China Standard
Time(UT+8:00),而客户端JavaScript则默认采用的是美国的中部时间Central
Standard Time (USA)(UT-6:00)。
4、整个地球分为24个时区,每个时区都有自己的本地时间。
UTC + 时区差 = 本地时间
北京时区是东八区,领先UTC八个小时。
时区差东为正,西为负。例如,东八区(北京)是
+0800,西五区(纽约)是-0500,加州是西八区,是-0800,美国中部时区是西六区,-0600,
美国山地时区是西七区,-0700,太平洋时
区是西八区,-0800,在夏天使用夏时制,成为-0700。德国时区是东一区,+0100,夏天变为+0200。
时区差东为正,西为负。在此,把东八区时区差记为 +0800,
UTC + (+0800) = 北京时间
UTC + (-0500) = 纽约时间
北京时间 = 纽约时间 + 1300
北京时间Date:Thur,08 Oct 2009 09:32:30 +08:00
09+24-13=20
纽约时间Date:Thur,07 Oct 2009 20:32:30 -05:00
5、Java中取的CST时间是中国标准时间。
Thu Oct 08 11:41:02 CST 2009采用的是中国的CST标准时间
public static void cst2gmt(Date date) {
DateFormat nowFormat = new SimpleDateFormat();
DateFormat cstFormat = new SimpleDateFormat();
DateFormat gmtFormat = new SimpleDateFormat();
TimeZone nowTime = TimeZone.getTimeZone(”GMT+8:00″);
TimeZone gmtTime = TimeZone.getTimeZone(”GMT”);
TimeZone cstTime = TimeZone.getTimeZone(”CST”);
cstFormat.setTimeZone(gmtTime);
gmtFormat.setTimeZone(cstTime);
nowFormat.setTimeZone(nowTime);
System.out.println(”NOW Time: ” + nowFormat.format(date));
System.out.println(”GMT Time: ” + cstFormat.format(date));
System.out.println(”CST Time: ” + gmtFormat.format(date));
}
执行结果如下:
NOW Time: 09-10-8 下午7:41
GMT Time: 09-10-8 上午11:41
CST Time: 09-10-8 上午6:41
Thu Oct 08 19:41:02 CST 2009
Thu Oct 08 11:41:02 CST 2009
JavaScript中取的CST时间是美国标准时间:
09+24-14=19:00
Thu Oct 08 19:45:46 CST 2009表示的是Fri Oct 9 09:45:46 UTC+0800
2009的中国标准时间
< –script LANGUAGE=”JavaScript”>

时间的修改:

 

第一种情况:

 

  在联网状态下,直接使用ntpdate 命令就可以同步时间

时区缩写:

[root@web113 ~]# ntpdate
-bash: /usr/sbin/ntpdate: No such file or directory

标准时间代码

与GMT的偏移量

描述

NZDT

+13:00

新西兰夏令时

IDLE

+12:00

国际日期变更线,东边

NZST

+12:00

新西兰标准时间

NZT

+12:00

新西兰时间

AESST

+11:00

澳大利亚东部夏时制

CST(ACSST)

+10:30

中澳大利亚标准时间

CADT

+10:30

中澳大利亚夏时制

SADT

+10:30

南澳大利亚夏时制

EST(EAST)

+10:00

东澳大利亚标准时间

GST

+10:00

关岛标准时间

LIGT

+10:00

澳大利亚墨尔本时间

CAST

+9:30

中澳大利亚标准时间

SAT(SAST)

+9:30

南澳大利亚标准时间

WDT(AWSST)

+9:00

澳大利亚西部标准夏令时

JST

+9:00

日本标准时间,(USSR Zone 8)

KST

+9:00

韩国标准时间

MT

+8:30

毛里求斯时间

WST(AWST)

+8:00

澳大利亚西部标准时间

CCT

+8:00

中国沿海时间(北京时间)

JT

+7:30

爪哇时间

IT

+3:30

伊朗时间

BT

+3:00

巴格达时间

EETDST

+3:00

东欧夏时制

CETDST

+2:00

中欧夏时制

EET

+2:00

东欧,(USSR Zone 1)

FWT

+2:00

法国冬时制

IST

+2:00

以色列标准时间

MEST

+2:00

中欧夏时制

METDST

+2:00

中欧白昼时间

SST

+2:00

瑞典夏时制

BST

+1:00

英国夏时制

CET

+1:00

中欧时间

DNT

+1:00

Dansk Normal Tid

FST

+1:00

法国夏时制

MET

+1:00

中欧时间

MEWT

+1:00

中欧冬时制

MEZ

+1:00

中欧时区

NOR

+1:00

挪威标准时间

SET

+1:00

Seychelles Time

SWT

+1:00

瑞典冬时制

WETDST

+1:00

西欧光照利用时间(夏时制)

GMT

0:00

格林威治标准时间

WET

0:00

西欧

WAT

-1:00

西非时间

NDT

-2:30

纽芬兰(新大陆)白昼时间

ADT

-03:00

大西洋白昼时间

NFT

-3:30

纽芬兰(新大陆)标准时间

NST

-3:30

纽芬兰(新大陆)标准时间

AST

-4:00

大西洋标准时间(加拿大)

EDT

-4:00

(美国)东部夏令时

CDT

-5:00

(美国)中部夏令时

EST

-5:00

(美国)东部标准时间

CST

-6:00

(美国)中部标准时间

MDT

-6:00

(美国)山地夏令时

MST

-7:00

(美国)山地标准时间

PDT

-7:00

(美国)太平洋夏令时

PST

-8:00

(美国)太平洋标准时间

YDT

-8:00

Yukon夏令时

HDT

-9:00

夏威仪/阿拉斯加白昼时间

YST

-9:00

Yukon标准时

AHST

-10:00

夏威仪-阿拉斯加标准时间

CAT

-10:00

中阿拉斯加时间

NT

-11:00

州时间(Nome Time)

IDLW

-12:00

国际日期变更线,西边

  yum安装ntpdate 工具包
  

 

yum install -y ntpdate

  在网络没有问题的情况下:

  

[root@web113 ~]# ntpdate time.windows.com
15 Jan 22:28:12 ntpdate[1588]: step time server 40.118.103.7 offset 5.003850 sec

  第二种方式:

  手动方式 date -s 时间格式 【此种方式略】

  将时间写入CMOS的操作,这就是写入硬件的操作 

  

clock -w 

  查看CMOS中的硬件时间:

[root@web113 ~]# clock --show
Sun 15 Jan 2017 10:35:19 PM CST  -0.438400 seconds

  

  hwclock 命令或者 clock 

  其中,clock和hwclock用法相近,只用一个就
行,只不过clock命令除了支持x86硬件体系外,还支持Alpha硬件体系。

 

更多关于时间的设置信息,可以参考:

  

  

  

发表评论

电子邮件地址不会被公开。 必填项已用*标注