Julia – Date & Time

Julia – Date & Time ”; Previous Next Julia has a standard package named Dates which provides us the following two functions to work with Dates and Times − Using Dates Import Dates The difference between these two functions is that if we use import Dates function then we will have to explicitly prefix Dates with every function, for example, Dates.dayofweek(dt). On the other hand, if we use using Dates function then we do not have to add the prefix Dates explicitly with every function because it will bring all exported Dates function into main. Relationship between Types Julia use various types to store Dates, Times, and DateTimes. The diagram below shows the relationship between these types − Date, Time, and DateTimes To work with Dates and Times, Julia has the following three datatypes − Dates.Time − Accurate to nanosecond, this object represents a precise moment of the day. Dates.Date − As the name implies, it represents just a date. Dates.DateTime − Accurate to a millisecond, this object represents combination of a date and a time of day. It actually specifies an exact moment in time. Example julia> rightnow = Dates.Time(Dates.now()) 15:46:39.872 julia> My_Birthday = Dates.Date(1984,1,17) 1984-01-17 julia> armistice_date = Dates.DateTime(1990,11,11,11,11,11) 1990-11-11T11:11:11 julia> today_date = Dates.today() 2020-09-22 julia> Dates.now(Dates.UTC) 2020-09-22T10:18:32.008 julia> Dates.DateTime(“20180629 120000”, “yyyymmdd HHMMSS”) 2018-06-29T12:00:00 julia> Dates.DateTime(“19/07/2007 17:42”, “dd/mm/yyyy HH:MM”) 2007-07-19T17:42:00 Queries regrading Date and Time After having the objects such as date/time or date, we can use the following functions to extract the required information − julia> Dates.year(My_Birthday) 1984 julia> Dates.month(My_Birthday) 1 julia> Dates.minute(now()) 22 julia> Dates.hour(now()) 19 julia> Dates.second(now()) 19 julia> Dates.minute(rightnow) 46 julia> Dates.hour(rightnow) 15 julia> Dates.second(rightnow) 39 julia> Dates.dayofweek(My_Birthday) 2 julia> Dates.dayname(My_Birthday) ”Tuesday” julia> Dates.yearmonthday(My_Birthday) (1984, 1, 17) julia> Dates.dayofweekofmonth(My_Birthday) 3 Date Arithmetic It is also possible to do arithmetic on date/time as well as date objects. The most common one is to find the difference between two such objects as shown in the below example − Example julia> today_date – My_Birthday 13409 days julia> datetimenow – armistice_date 943436237800 milliseconds We can convert these differences in some unit as follows − julia> Dates.Period(today_date – My_Birthday) 13409 days julia> Dates.canonicalize(Dates.CompoundPeriod(datetimenow – armistice_date)) 1559 weeks, 6 days, 9 hours, 37 minutes, 17 seconds, 800 milliseconds We can also add and subtract periods of time to date and date/time objects as follows − julia> My_Birthday + Dates.Year(20) + Dates.Month(6) 2004-07-17 In the above example, we have added 20 years and 6 months to my birth date. Range of Dates Julia provides the facility to create range of dates by making iterable range objects. In the example given below, we will be creating an iterator that yields the first day of every month. Example julia> date_range = Dates.Date(2000,1,1):Dates.Month(1):Dates.Date(2020,1,1) Date(“2000-01-01”):Month(1):Date(“2020-01-01”) From the above range object, we can find out which of these fall on weekdays. For this we need to create an anonymous function to filter() which will test the day name against the given day names − julia> weekdaysfromrange = filter(dy -> Dates.dayname(dy) != “Saturday” && Dates.dayname(dy) != “Sunday” , date_range) 171-element Array{Date,1}: 2000-02-01 2000-03-01 2000-05-01 2000-06-01 2000-08-01 2000-09-01 2000-11-01 2000-12-01 2001-01-01 2001-02-01 2001-03-01 2001-05-01 2001-06-01 ⋮ 2018-10-01 2018-11-01 2019-01-01 2019-02-01 2019-03-01 2019-04-01 2019-05-01 2019-07-01 2019-08-01 2019-10-01 2019-11-01 2020-01-01 Formatting of Dates Following table gives the date formatting codes with the help of which we can specify date formats − Character Date/Time element Y Year digit Ex. yyyy => 1984, yy => 84 m Month digit Ex. m => 7 or 07 u Month name Ex. Jun U Month name Ex. January e Day of week Ex. Mon E Day of week Ex. Monday d Day Ex. 1 or 01 H Hour digit Ex. HH => 00 M Minute digit Ex. MM => 00 S Second digit Ex. S => 00 s Millisecond digit Ex. .000 Example julia> Dates.Date(“Sun, 27 Sep 2020”, “e, d u y”) 2020-09-27 julia> Dates.DateTime(“Sun, 27 Sep 2020 10:25:10”, “e, d u y H:M:S”) 2020-09-27T10:25:10 Rounding Dates and Times As we know that the functions round(), floor(), and ceil() are usually used to round numbers up or down. These functions can also be used to round dates so that the dates can be adjusted forward or backward in time. Example julia> Dates.now() 2020-09-27T13:34:03.49 julia> Dates.format(round(Dates.DateTime(Dates.now()), Dates.Minute(15)), Dates.RFC1123Format) ”Sun, 27 Sep 2020 13:30:00″ The ceil() function will adjust the dates/time forward as given below − julia> My_Birthday = Dates.Date(1984,1,17) 1984-01-17 julia> ceil(My_Birthday, Dates.Month) 1984-02-01 julia> ceil(My_Birthday, Dates.Year) 1985-01-01 julia> ceil(My_Birthday, Dates.Week) 1984-01-23 Recurring Dates If we want to find all the dates in a range of dates that satisfy some criteria, it is called recurring dates. Let us understand with the help of following example − First, we need to create a Range of date as we did previously − julia> date_range = Dates.Date(2000,1,1):Dates.Month(1):Dates.Date(2020,1,1) Date(“2000-01-01”):Month(1):Date(“2020-01-01”) Now we can use filter() function to find Sundays in a month − julia> filter(d -> Dates.dayname(d) == “Sunday”, date_range) 35-element Array{Date,1}: 2000-10-01 2001-04-01 2001-07-01 2002-09-01 2002-12-01 2003-06-01 2004-02-01 2004-08-01 2005-05-01 2006-01-01 2006-10-01 2007-04-01 2007-07-01 ⋮ 2013-12-01 2014-06-01 2015-02-01 2015-03-01 2015-11-01 2016-05-01 2017-01-01 2017-10-01 2018-04-01 2018-07-01 2019-09-01 2019-12-01 Unix time Unix time is another type of timekeeping in which the count of the number of seconds that have elapsed since the birth of Unix (beginning of the year 1970). We will never observe the end of Unix time because Julia store the count in a 64-bit integer. The time() function will return the Unix time value − julia> using Dates julia> time() 1.60206441103e9 The unix2datetime() function will convert a Unix time value to date/time object − julia> Dates.unix2datetime(time()) 2020-09-10T09:54:52.894 Moments in time DateTimes, in the field instant, are stored in milliseconds. We can obtain this value by using Dates.value function as follows − julia> moment=Dates.now() 2020-09-10T09:56:11.885 julia> Dates.value(moment) 63737767811885 julia> moment.instant Dates.UTInstant{Millisecond}(Millisecond(63737767811885))