Image placeholder

Spacetime – 轻量级的时区处理JavaScript库

Image placeholder
F2EX 2017-08-12

使用一种轻量级的方式来操纵,遍历,比较和格式化地球上任意地区的日期和时间。

是啊,🙌 世界真的很大,但是 Spacetime 库真的很小。

特色:

  • 获取/设置 远程时区的日期很时间
  • 全球支持夏令时, 闰年+秒, 和半球时间
  • 按季度、季节、月份和星期计算
  • 远程日期比较
  • ES2015 JS编写,使用ES5发布,测试了 Node 和浏览器
  • 只有 35KB (压缩后12KB)
  • 经过良好测试,Apache 2.0 授权

安装

npm install spacetime --save

测试

在 Node 中:

npm test

格式化日期

Spacetime 允许以一堆默认格式快速渲染日期和时间。你可以通过直接调用 .format() 而不使用参数。

如果你希望传递所需的格式:

s.format('day-short')
// 'Sat'
s.format('date-ordinal')
// '26th'

Spacetime 支持灵活的,以人为本的格式,而不是经典的 Unix 格式化样式(即 'ddd hA' )。

方法
* 'day'  -       'Friday'
* 'day-short'  - 'Fri'
* 'date'  -      '5'
* 'date-ordinal'  - '5th'
* 'month'  -     'January'
* 'month-short'  - 'Jan'
* 'time'  -      '4:59pm'
* 'time-24h'  -  '16:59'
* 'year'  -      '2018'
* 'year-short'  - "\'18"
* 'numeric-us'  - '01/05/2018'
* 'numeric-uk'  - '05/01/2018'
* 'numeric-cn'  - '2018/01/05'
* 'iso'  -        '2018-01-05T16:59:33:152Z'
* 'iso-short'  -  '2018-01-05'
* 'iso-utc'  -    '2018-01-05T14:59:33.152Z'
* 'nice'  -       'January 5th, 4:59pm'
* 'nice-day'  -   'Friday January 5th, 4:59pm'
* 'nice-short'  - 'Jan 5th, 4:59pm'
* 'full'  -       'Friday January 5th, 2018'
* 'full-short'  - 'Fri Jan 5th, 2018'
* 'ordinal'  -    '5th'
* 'date-short'  - '5'
* 'time-12h'  -   '4:59pm'
* 'time-h12'  -   '4:59pm'
* 'time-h24'  -   '16:59'
* 'numeric'  -    '01/05/2018'
* 'mdy'  -        '01/05/2018'
* 'dmy'  -        '05/01/2018'
* 'ymd'  -        '2018/01/05'
* 'little-endian'  - '05/01/2018'
* 'big-endian'  - '2018/01/05'

输入日期

你可以使用各种输入创建一个特定的日期+时间,取决于你的使用习惯。

Spacetime 支持所有 JavaScript 日期输入格式:

ISO Date  "2015-03-25"
Short Date  "03/25/2015" or "2015/03/25"
Long Date "Mar 25 2015" or "25 Mar 2015"
Full Date "Wednesday March 25 2015"
Epoch Time      1493042538

以及一些更结构化的格式,如:

// 数组
spacetime([2019, 0, 1,6,30]) // January 1st, 2019, 6:30am

// 基于对象
spacetime({year:2016, month:1, date:3})// February 1st, 2016

与 JavaScript Date 对象一样,当有信息丢失时,Spacetime 将使用你当前的本地时间填充缺少的信息:

// Will be June, with your current year, date, and time
spacetime({month:'june'}) 
// June 3rd, 2017, 12:02pm (or whatever)

数组和基于对象的输入使用基于0的月份,因为假设它们在软件中动态使用。

一如以往,每个月的日期都是以1为基础的。

更多信息和注意事项

API

var spacetime=require('spacetime')

s = spacetime.now()  //现在
s = spacetime.today() // 今天早上
s = spacetime.tomorrow() // 明天早上

// 输入日期
s = spacetime(1489520157) // 特定时间,例如1970-01-01 00:00:00 UTC
s = spacetime([2017, 5, 2]) // yyyy, m, d (月的基数是0, 天的基数是1)
s = spacetime('July 2, 2017 5:01:00') // 国际标准 ISO 表示方法

// 远程日期
s = spacetime(1489520157, 'Canada/Pacific')

// 获取/设置方法
s.date() // 14
s.year() // 2017
s.season() // Spring(季节)
s.hour(5) // 更改为上午5点
s.date(15) // 更改为第15
s.day('monday') // 更改为星期一(本周)
s.month('march') // 更改为3月1日(今年)
s.quarter(2) // 更改为4月1日

// 加/减方法
s.add(1, 'week')
s.add(3, 'quarters')
s.subtract(2, 'months').add(1,'day')

// 时区元数据
s.timezone().name // 'Canada/Eastern' (推测或显式)
s.timezone().hemisphere // 北半球
s.timezone().current.offset // -240 (以分钟为单位)
s.timezone().current.isDst // True

// 比较
let d = spacetime([2017, 5, 2])
let start = s.clone()
let end = s.clone()
start.subtract(1, 'milliseconds')
end.add(1, 'milliseconds')

// gt/lt/equals
s.isAfter(d) // True
s.isEqual(d) // False
s.isBefore(d) // False
s.isBetween(start, end) // True

// 单位比较
s.isSame(d, 'year') // True
s.isSame(d, 'date') // False
s.diff(d, 'day') // 5
s.diff(d, 'month') // 0

// 格式化日期+时间
s.format('time') // '5:01am'
s.format('numeric-uk') // 02/03/2017
s.format('month') // 'April'
s.format('month-short') // 'Apr'

// 日历
s.startOf('day') // 12:00am
s.startOf('month') // 12:00am, April 1st
s.endOf('quarter') // 11:59:59pm, June 30th

// 基于百分比的信息
s.progress().month = 0.23 // 一个季度的第一个月
s.progress().day = 0.48   // 几乎中午
s.progress().hour = 0.99  // 59分59秒

// 其他功能
s.goto('Australia/Brisbane') // 同时转入新的时区
s.clone() // 创建一个副本
s.isValid() // 验证(9月32日 → false)

2017-08-12