Tajm, pronounced time, is ReasonML library to handle most needs when time and dates are needed.
The purpose of the library is to have a tool for handling times and date that is as
uncoupled from Js.Date
and provide the most common functionalities generally needed. Tajm supports time zone locations, such as Europe/London
, when parsing and formatting dates. The IANA data needed for this and is compiled into the library (unused timezone data can be tree shooken out for production).
âš Please try it, but use with care. tajm is still a work in progress
npm install tajm --save
or
yarn add tajm
Add tajm
to bs-dependencies
in your bsconfig.json
:
{
"bs-dependencies": [
"tajm"
]
}
The api is inspierd by Golang time lib
Tajm does not differentiate between a date and a time (wall clock). Instead there is only one type, time_
, which can be used for both dependent on your need
Tajm
Tajm.zero() |> Tajm.string |> Js.log
// 1970-01-01T00:00:00.000Z
Creates a time of current time in UTC
Tajm.now() |> Tajm.string |> Js.log
// 2020-08-07T07:38:57.613Z
Tajm.ofUnix(1585443600000.) |> Tajm.string |> Js.log
// 2020-03-29T01:00:00.000Z
Tajm.make(
~y=2020,
~m=February,
~d=29,
~hour=15,
~min=32,
~sec=42,
~ms=123,
Tajm.z,
)
|> Tajm.string
|> Js.log;
// 2020-02-29T15:32:42.123Z
Tajm.zero |> Tajm.compare(Tajm.now()) |> Js.log
// 1
Tajm.now() |> Tajm.unix |> Js.log
// 1596788909886
Tajm.now() |> Tajm.toJs |> Js.log
// 2020-08-07T08:29:14.241Z
Adds a duration to a time and returns the new time.
âš Do not use longer periods, days, months and so on. This since eg. hour * 24 * 365 is not nessasary a year, due to leapyears and leap secounds. Insead use
addDate
Tajm.now()
|> tee2(Tajm.string, Js.log)
|> Tajm.add(Tajm.Duration.hour)
|> Tajm.string
|> Js.log
// 2020-08-07T08:35:18.066Z
// 2020-08-07T09:35:18.066Z
Subtracts t1 from t2 and returns the difference as a duration (ms)
let t1 = Tajm.now();
let t2 =
t1 |> Tajm.add(Tajm.Duration.hour) |> Tajm.add(15. *. Tajm.Duration.minute);
Tajm.sub(t1, t2) |> Tajm.Duration.string |> Js.log
// -1h15m0s
Returns the duration elapsed from t
Tajm.now()
|> Tajm.add((-35.) *. Tajm.Duration.secound)
|> Tajm.since
|> Tajm.Duration.string
|> Js.log;
// 0h0m35s
Returns the dutaion from now until t
Tajm.now()
|> Tajm.add(2. *. Tajm.Duration.minute)
|> Tajm.until
|> Tajm.Duration.string
|> Js.log;
// 0h2m0s
Truncate the time a with the specified duration, eg. if duration second, seconds and milliseconds is truncated from time
Tajm.now() |> Tajm.truncate(Tajm.Duration.minute) |> Tajm.string |> Js.log
// 2020-08-07T08:52:00.000Z
Is time1 before time2
Tajm.now()->Tajm.before(Tajm.zero) |> Js.log;
// false
Is time1 after time2
Tajm.now()->Tajm.after(Tajm.zero) |> Js.log;
// true
Is time in the future
Tajm.zero |> Tajm.future |> Js.log;
// false
Is time in the past
Tajm.zero |> Tajm.past |> Js.log;
// true
Sets the location to UTC
Tajm.now()
|> Tajm.atUTC
|> Tajm.format("2006-01-02 15:04:05 Z07:00")
|> Js.log
// 2020-08-07 09:05:38 Z
Sets the location to the Local time zone
Tajm.now()
|> Tajm.atLocal
|> Tajm.format("2006-01-02 15:04:05 Z07:00")
|> Js.log
// 2020-08-07 11:05:38 +02:00
Sets the location to a fixed offset
Tajm.now()
|> Tajm.atFixed("CEST", 2 * 60 * 60)
|> Tajm.format("2006-01-02 15:04:05 MST")
|> Js.log
// 2020-08-07 11:07:46 CEST
Sets the location to the time
Tajm.now()
|> Tajm.at(Tajm.local)
|> Tajm.format("2006-01-02 15:04:05 MST")
|> Js.log;
// 2020-08-07 11:10:21 Central European Summer Time
Returns the location of the time
let zone = Tajm.now() |> Tajm.at(Tajm.local) |> Tajm.zone;
Tajm.zero
|> Tajm.at(zone)
|> Tajm.format("2006-01-02 15:04:05 Z07:00")
|> Js.log;
// 1970-01-01 01:00:00 +01:00
Tries to load retrieve the location by name, eg UTC, Local and Europe/Stockholm
For IANA locations, such as Europe/Stockholm, a time zone database must be loaded, view section on IANA
Returns the weekday of the provided time
Tajm.now() |> Tajm.weekday |> Tajm.Conv.stringOfWeekday |> Js.log
// Thursday
Returns the year of the provided time
Tajm.zero |> Tajm.year |> Js.log;
// 1970
Returns the month of the provided time
Tajm.zero |> Tajm.month |> Tajm.Conv.stringOfMonth |> Js.log
// January
Returns the day in the month of the provided time
Tajm.zero |> Tajm.day |> Js.log
// 1
Returns the hour of the provided time
Tajm.zero |> Tajm.hour |> Js.log
// 0
Returns the minute of the provided time
Tajm.zero |> Tajm.minute |> Js.log
// 0
Returns the second of the provided time
Tajm.zero |> Tajm.second |> Js.log
// 0
Returns the millisecond of the provided time
Tajm.zero |> Tajm.millisecond |> Js.log
// 0
Returns day of the year, where 01/jan is 1 and 31/dec is 365
Tajm.now() |> Tajm.yearDay |> Js.log
// 220
Returns the week of the year, 1-53
32
Returns the wall clock as three ints, (hh mm ss)
Tajm.now() |> Tajm.clock |> Js.log
// [ 9, 29, 43 ]
Returns the calender date, (year month day)
Tajm.now() |> Tajm.date |> Js.log
// [ 2020, 7, 7 ]
Sets any specific parameters to a time and defaults to current
Tajm.now() |> Tajm.set(~d=1) |> Tajm.string |> Js.log
// 1999-08-01T09:32:06.946Z
Sets any specific date to a time and keep hour, min, sec, ms from original
Tajm.now() |> Tajm.setDate(1999, August, 1) |> Tajm.string |> Js.log
// 1999-08-01T09:33:27.010Z
Sets any specific wall clock to a time and keep year, month and day from original
Tajm.now() |> Tajm.setClock(10, 10, 10) |> Tajm.string |> Js.log
// 2020-08-07T10:10:10.552Z
Add lager time units, year, month and day, to a time
Tajm.zero |> Tajm.addDate(~y=1, ~m=2, ~d=3) |> Tajm.string |> Js.log
// 1971-03-04T00:00:00.000Z
Tajm.now() |> Tajm.startOf(Day) |> Tajm.string |> Js.log
// 2020-08-07T00:00:00.000Z
Tajm.now() |> Tajm.endOf(Day) |> Tajm.string |> Js.log
// 2020-08-07T23:59:59.999Z
Formats a time to a string in accordance to the layout string. The layout is borrowed from golang time library with some addition and changes. It provides a human friendly way for developers to see what the expected output will be.
Tajm.now() |> Tajm.format(Tajm.fmtRFC850) |> Tajm.string |> Js.log
// Friday, 07-Aug-20 09:40:55 UTC
Tajm.now() |> Tajm.format("2006-01-02T15:04:05Z07:00") |> Tajm.string |> Js.log
// 2020-08-07T09:40:55Z
Pre defined Layouts
Tajm.fmtANSIC = "Mon Jan _2 15:04:05 2006";
Tajm.fmtUnixDate = "Mon Jan _2 15:04:05 MST 2006";
Tajm.fmtRubyDate = "Mon Jan 02 15:04:05 -0700 2006";
Tajm.fmtRFC822 = "02 Jan 06 15:04 MST";
Tajm.fmtRFC822Z = "02 Jan 06 15:04 -0700"; // RFC822 with numeric zone
Tajm.fmtRFC850 = "Monday, 02-Jan-06 15:04:05 MST";
Tajm.fmtRFC1123 = "Mon, 02 Jan 2006 15:04:05 MST";
Tajm.fmtRFC1123Z = "Mon, 02 Jan 2006 15:04:05 -0700"; // RFC1123 with numeric zone
Tajm.fmtRFC3339 = "2006-01-02T15:04:05Z07:00";
Tajm.fmtRFC3339ms = "2006-01-02T15:04:05.999Z07:00";
Tajm.fmtISOTimestamp = "2006-01-02T15:04:05Z07:00"; // ISO 8601
Tajm.fmtISOTimestampMs = "2006-01-02T15:04:05.000Z07:00"; // ISO 8601
Tajm.fmtISOWeek = "2006-W49"; // ISO 8601
Tajm.fmtISOWeekDay = "2006-W49-7"; // ISO 8601
Tajm.fmtKitchen = "3:04PM";
Layout Reference
| LongMonth // = "January";
| Month // = "Jan";
| NumMonth // = "1";
| ZeroMonth // = "01"; Padd left with 0
| RightMonth // = "_1"; Right aligns
| LongWeekDay // = "Monday";
| WeekDay // = "Mon";
| NumWeekDay // = "7";
| Day // = "2";
| ZeroDay // = "02"; Padd left with 0
| RightDay // = "_2"; Right aligns
| YearDay // = "8"
| ZeroYearDay // = "008";
| RightYearDay // = "__8"; Right aligns
| Hour // = "15";
| Hour12 // = "3";
| ZeroHour12 // = "03"; Padd left with 0
| RightHour12 // = "_3"; Right aligns
| Minute // = "4";
| ZeroMinute // = "04"; Padd left with 0
| RightMinute // = "_4"; Right aligns
| YearWeek // = "49";
| RightYearWeek // = "_9" Right aligns
| ZeroYearWeek // = "09" Padd left with 0
| Second // = "5";
| ZeroSecond // = "05"; Padd left with 0
| RightSecond // = "_5"; Right aligns
| LongYear // = "2006";
| Year // = "06";
| PM(bool) // = "PM" | "pm";
| TZ // = "MST"; Poor interop with local timezone due to the js Date api behavior
| ISO8601TZ // = "Z0700"; prints Z for UTC
| ISO8601ShortTZ // = "Z07";
| ISO8601ColonTZ // = "Z07:00"; prints Z for UTC
| NumTZ // = "-0700"; always numeric
| NumShortTZ // = "-07"; always numeric
| NumColonTZ // = "-07:00";
| FracSecond0(int) // = ".0"; ".00", ".000", ... , trailing zeros included
| FracSecond9(int) // = ".9"; ".99", ".999" ... , trailing zeros omited
Parses a string into a time given a specific layout
"2020-08-07 09:40:55 +02:00"
|> Tajm.parse("2006-01-02 15:04:05 Z07:00")
|> (
fun
| Some(t) => t |> Tajm.string
| None => "Failed to parse"
)
|> Js.log;
// 2020-08-07T07:40:55.000Z
Returns a ISO Timestamp formatted string of the time
Tajm.now() |> Tajm.string |> Js.log;
// 2020-08-07T09:47:58.315Z
Tajm.Duration
Tajm.Is
Tajm.Conv
Types
type time_ = {
t: int64,
loc: location_,
};
type duration_ = float;
type month_ =
| January
| February
| March
| April
| May
| June
| July
| August
| September
| October
| November
| December;
type weekday_ =
| Monday
| Tuesday
| Wednesday
| Thursday
| Friday
| Saturday
| Sunday;
type location_ =
| Fixed(string, int) // (name, offset) in secound, Fixed("CET", 3600)
| Local // Uses the local location defined by the environment
| IANA(Tajm_Iana_Tz.tz); // A IANA location, eg Europe/London
git clone https://github.com/crholm/tajm.git
cd tajm
npm install
npm run build
npm run test
- More tests
- Finish Tajm.parse
- Expose IANA properly
- Finish Documentation