Socket
Socket
Sign inDemoInstall

jin-time

Package Overview
Dependencies
0
Maintainers
1
Versions
12
Alerts
File Explorer

Advanced tools

Install Socket

Detect and block malicious and high-risk dependencies

Install

    jin-time

Cool date/time/duration/range arithmetic


Version published
Weekly downloads
2
Maintainers
1
Install size
44.4 kB
Created
Weekly downloads
 

Readme

Source

$jin.time

Small, simple, powerfull, and fast TypeScript/JavaScript library for proper date/time/duration/range arithmetic.

Installation

Direct

<script src="http://nin-jin.github.io/time/time2.js"></script>
<script>
	alert( $jin.time.moment() ) // alerts current time
</script>

Or get typescript sources from repository: https://github.com/nin-jin/pms-jin/tree/master/time

NPM

npm install jin-time
var time = require( 'jin-time' )
console.log( time.moment().toString() ) // logs current time

Comparison

Native Date

  • instance is timestamp representation (forever have time and timezone)
  • instance is mutable object
  • inconsistent, poor api
  • zero lib size, but very large client code
  • fastest

Speed of iso8601 serialization:

var m = new Date ; console.time('test') ; for( var i = 0 ; i < 100000 ; ++i ) m.toISOString() ; console.timeEnd('test')
// 150ms

Speed of iso8601 parsing:

console.time('test') ; for( var i = 0 ; i < 10000 ; ++i ) new Date( '2015-07-20T07:48:28.338+03:00' ) ; console.timeEnd('test')
// 13ms

MomentJS

  • instance is wrapper around native Date instance
  • instance is timestamp representation (forever have time and timezone)
  • instance is mutable object
  • large lib size (100kb core + plugins)
  • slow
  • too more specific features, but some basics supports only by plugins

Speed of iso8601 serialization:

var m = moment() ; console.time('test') ; for( var i = 0 ; i < 100000 ; ++i ) t.toISOString() ; console.timeEnd('test')
// 470ms

Speed of iso8601 parsing:

console.time('test') ; for( var i = 0 ; i < 10000 ; ++i ) moment( '2015-07-20T07:48:28.338+03:00' ) ; console.timeEnd('test')
// 440ms

$jin.time

  • all time components stores separately
  • instance is immmutable object
  • cool consistent core, but some needed features not implemented yet
  • small lib size (35kb)
  • fast

Speed of iso8601 serialization:

var m = $jin.time.moment() ; console.time('test') ; for( var i = 0 ; i < 100000 ; ++i ) m.toString() ; console.timeEnd('test')
// 180ms

Speed of iso8601 parsing:

console.time('test') ; for( var i = 0 ; i < 10000 ; ++i ) $jin.time.moment( '2015-07-20T07:48:28.338+03:00' ) ; console.timeEnd('test')
// 65ms

API

Moments

Creating

// current time in current time zone
$jin.time.moment()

// by timestamp
$jin.time.moment( 1437316165000 )

// by native Date
$jin.time.moment( new Date )

// by iso8601 string
$jin.time.moment( '2015-07-19T17:27:58.065+03:00' ) // full time
$jin.time.moment( '2015-07-19T17:27:58.065' ) // time without offset (non local!)
$jin.time.moment( '2015-07-19' ) // date without time (non 00:00:00)

// by components
$jin.time.moment({
	year : 2015 ,
	month : 6 , // 0 - January
	day : 18 , // 0 - first day of month
	hour : 17 ,
	minute : 27 ,
	second : 58.65 , // fractional, no property "millisecond"
	offset : { // this is $jin.time.duration
		hour : 3 ,
		minute : 0 ,
	} ,
})

// by list of components
$jin.time.moment([ 2015 , 6 , 18 , 17 , 27 , 58.65 , [ 3 , 0 ]])

Getters

// component value (undefined by default)
var moment = $jin.time.moment()
moment.year // number
moment.month // 0 .. 11
moment.day // 0 .. 30
moment.hour // 0 .. 23
moment.minute // 0 .. 59
moment.second // 0 .. 59 (fractional)
moment.offset // $jin.time.duration

// day of week
$jin.time.moment().weekDay // 0 - sunday , 6 - saturday

// timestamp
$jin.time.moment().valueOf() // Date.now()

// native Date
$jin.time.moment().native // new Date

// iso8601
$jin.time.moment().toString() // ( new Date ).toISOString()
$jin.time.moment().toJSON() // ( new Date ).toISOString()

Arithmetic

// create moment by normalize one
$jin.time.moment( '2015-07-35' ).normal // $jin.time.moment( '2015-08-04' )

// create moment by merge one moment with another
$jin.time.moment( '2015-07-19' ).merge({ month : 7 , day : 4 }) // $jin.time.moment( '2015-08-04' )

// create moment by shift one by duration
$jin.time.moment( '2015-07-19' ).shift( 'P16D' ) // $jin.time.moment( '2015-08-04' )

// create moment by shift one to offset
$jin.time.moment( '2015-07-19T19:24+03:00' ).toOffset( 'Z' ) // $jin.time.moment( '2015-07-19T16:24+00:00' )

Serialization

$jin.time.moment().toString( 'YYYY-MM-DD hh:mm (WeekDay)' ) // "2015-07-20 07:22 (Monday)"

Mnemonics:

  • single letter for numbers: M - month number, D - day of month.
  • uppercase letters for dates, lowercase for times: M - month number , m - minutes number
  • repeated letters for define register count: YYYY - full year, YY - shot year, MM - padded month number
  • words for word representation: Month - month name, WeekDay - day of week name
  • shortcuts: WD - short day of week, Mon - short month name.

Durations

Creating

 // zero duration
$jin.time.duration()

// by milliseconds count
$jin.time.duration( 60000 ) // 60 seconds (non 1 minute!)

// by iso8601 string
$jin.time.duration( 'P1Y2M3DT4H5M6.7S' ) // all components are optional
$jin.time.duration( 'PT' ) // zero duration

// by components
$jin.time.duration({
	year : 1 ,
	month : 2 ,
	day : 3 ,
	hour : 4 ,
	minute : 5 ,
	second : 6.7 ,
})

// by list of components
$jin.time.duration([ 1 , 2 , 3 , 4 , 5 , 6.7 ])

Getters

//component value (0 by default)
var dur = $jin.time.duration()
durdur.year // number
dur.month // number
dur.day // number
dur.hour // number
dur.minute // number
dur.second // number (fractional)

// duration in milliseconds
$jin.time.duration( 'PT1M' ).valueOf() // 60000

// iso8601
$jin.time.duration( 'PT1M0S' ).toString() // PT1M
$jin.time.duration( 'PT1M0S' ).toJSON() // PT1M

Arithmetic

// create duration as summ of one and another
$jin.time.duration( 'PT1h' ).summ( 'PT1h1m' ) // $jin.time.duration( 'PT2H2M' )

// create duration as substract of another from one
// attention! can produce negative values that is not compatible with iso8601
$jin.time.duration( 'PT1h' ).sub( 'PT1h1m' ) // $jin.time.duration( 'PT-1M' )

Ranges

Creating

// by iso8601 string
$jin.time.range( '2015-07-19/2015-08-02' ) // by two moments
$jin.time.range( '2015-07-19/P14D' ) // by two start moment and duration
$jin.time.range( 'P14D/2015-08-02' ) // by two end moment and duration

// by components
$jin.time.range({
	start : '2015-07-19' ,
	end : '2015-08-02' ,
})
$jin.time.range({
	start : '2015-07-19' ,
	duration : 'P14D' ,
})
$jin.time.range({
	duration : 'P14D' ,
	end : '2015-08-02' ,
})

// by list of components
$jin.time.range([ '2015-07-19' , '2015-08-02' ])
$jin.time.range([ '2015-07-19' , null , 'P14D' ])
$jin.time.range([ null , '2015-08-02' , 'P14D' ])

Getters

// component value (third are calculated by defined two)
$jin.time.range( '2015/P1Y' ).end // $jin.time.moment( '2016' )
$jin.time.range( 'P1Y/2016' ).start // $jin.time.moment( '2015' )
$jin.time.range( '2015/2016' ).duration // $jin.time.duration( 'PT31536000S' )

// iso8601
$jin.time.range( '2015-01/P1M' ).toString() // '2015-01/P1MT'
$jin.time.range( '2015-01/P1M' ).toJSON() // '2015-01/P1MT'

Localization

To add some language support use typescript subclassing:

class moment_class_ru extends $jin.time.moment_class {
	static monthLong = [ 'Январь', 'Февраль', 'Март', 'Апрель', 'Май', 'Июнь', 'Июль', 'Август', 'Сентябрь', 'Октябрь', 'Ноябрь', 'Декабрь' ]
	static monthShort = [ 'Янв', 'Фев', 'Мар', 'Апр', 'Май', 'Июн', 'Июл', 'Авг', 'Сен', 'Окт', 'Ноя', 'Дек' ]
	static weekDayLong = [ 'Воскресенье', 'Понедельник', 'Вторник', 'Среда', 'Четверг', 'Пятница', 'Суббота' ]
	static weekDayShort = [ 'Вс', 'Пн', 'Вт', 'Ср', 'Чт', 'Пт', 'Сб' ]
}
$jin.time.moment['ru'] = moment_class_ru.make.bind( moment_class_ru )

Then you can use it:

$jin.time.moment['ru']().toString( 'YYYY-MM-DD (WD)' ) // "2015-07-20 (Пн)"

To Do

  • Parsing by patterns
  • Repeating intervals support
  • Better localization

Keywords

FAQs

Last updated on 20 Jul 2015

Did you know?

Socket for GitHub automatically highlights issues in each pull request and monitors the health of all your open source dependencies. Discover the contents of your packages and block harmful activity before you install or update your dependencies.

Install

Related posts

SocketSocket SOC 2 Logo

Product

  • Package Alerts
  • Integrations
  • Docs
  • Pricing
  • FAQ
  • Roadmap

Stay in touch

Get open source security insights delivered straight into your inbox.


  • Terms
  • Privacy
  • Security

Made with ⚡️ by Socket Inc