From: Oleg Babin via Tarantool-patches <tarantool-patches@dev.tarantool.org> To: Timur Safin <tsafin@tarantool.org> Cc: TML <tarantool-patches@dev.tarantool.org> Subject: Re: [Tarantool-patches] [RFC PATCH 00/13] Initial datetime support Date: Fri, 16 Jul 2021 09:58:44 +0300 [thread overview] Message-ID: <e1cbb1c6-fd54-ac3a-1dfc-2d877b58e74a@tarantool.org> (raw) In-Reply-To: <129501d779cd$9e83bfd0$db8b3f70$@tarantool.org> On 16.07.2021 02:03, Timur Safin wrote: > Thanks, Oleg, for your fast and valuable feedback! > [ You are the fastest hand on the wild west today! ] > > > : From: Tarantool-patches <tarantool-patches-bounces@dev.tarantool.org> On > : Subject: Re: [Tarantool-patches] [RFC PATCH 00/13] Initial datetime support > : <...> > : > : 6. Does this module allows to manipulate with timezones and locales? > : > : Icu-date that we currently use allows it > : (https://github.com/tarantool/icu-date). > > Not, at the moment. And I do like how it's handled in icu-date. And > surprisingly that was exactly original plan - to use icu database > for translation of timezone names into their offsets, with memorization > of results (exactly as it's done in zone_id_cache in icu-date.lua). > > Locales is the strongest feature in icu-date, and should be reused > properly while handling named-timezones. Will return here > > : > : Also try to use tests from icu-date module. I think it could be useful. > : The best option is to allow drop-in but I'm not sure that it's possible. > > Drop-in is hardly possible (because icu-date api looks too much mouthful > with all their forms of a kind date:get(icu_date.fields.MILLISECOND) or > date:get_attribute(attributes.MINIMAL_DAYS_IN_FIRST_WEEK). But tests might > be of help. (And I assume you meant tap tests, not busted tests). And while > we are here - why there are 2 kinds of tests? (And not only busted used because > it's much more convenient? :) ) Because it's impossible to install "busted" via tarantoolctl, because nobody tests is it compatible with Tarantool. Tarantool has built-in tap module that is used and also there is a luatest that seems to be ok for many cases. (But luatest was introduced a bit later than module was improted so we use tap for test). > > : 7. Is it expected? > : > : ``` > : > : tarantool> datetime.now() - datetime.now() > : --- > : - +18823 days, 16 hours, 29 minutes, 44.178836107254 seconds > : ... > : > : ``` > : > : I believe it should be 0. > > Not exactly 0, but very small fraction of second. Thanks for reporting - that > Was artifact of last minute rename/refactoring. Here is the patch for this > Problem and similar in + > > diff --git a/src/lua/datetime.lua b/src/lua/datetime.lua > index d28f931f6..57ef80403 100644 > --- a/src/lua/datetime.lua > +++ b/src/lua/datetime.lua > @@ -558,6 +558,17 @@ local function date_first(lhs, rhs) > end > end > > +local function _normalize_nsec(secs, nsec) > + if nsec < 0 then > + secs = secs - 1 > + nsec = nsec + NANOS_PER_SEC > + elseif nsec >= NANOS_PER_SEC then > + secs = secs + 1 > + nsec = nsec - NANOS_PER_SEC > + end > + return secs, nsec > +end > + > local function datetime_sub(lhs, rhs) > check_date(lhs) -- make sure left is date > local d, s = lhs, rhs > @@ -565,18 +576,15 @@ local function datetime_sub(lhs, rhs) > -- 1. left is date, right is date or delta > if (ffi.typeof(s) == datetime_t) or (ffi.typeof(s) == duration_t) then > local o > + > -- if they are both dates then result is delta > if ffi.typeof(s) == datetime_t then > o = duration_new() > else > o = datetime_new() > end > - o.secs = d.secs - s.secs > - o.nsec = d.nsec - s.nsec > - if o.nsec < 0 then > - o.secs = d.secs - 1 > - o.nsec = d.nsec + NANOS_PER_SEC > - end > + o.secs, o.nsec = _normalize_nsec(d.secs - s.secs, d.nsec - s.nsec) > + > return o > > -- 2. left is date, right is duration in months > @@ -602,12 +610,8 @@ local function datetime_add(lhs, rhs) > if (ffi.typeof(s) == datetime_t) or (ffi.typeof(s) == duration_t) then > local o = datetime_new() > > - o.secs = d.secs + s.secs > - o.nsec = d.nsec + s.nsec > - if o.nsec >= NANOS_PER_SEC then > - o.secs = d.secs + 1 > - o.nsec = d.nsec - NANOS_PER_SEC > - end > + o.secs, o.nsec = _normalize_nsec(d.secs + s.secs, d.nsec + s.nsec) > + > return o > > -- 2. left is date, right is duration in months > > : > : > : 8. Could you provide a helper that allows to convert unix time to datetime? > > Will introduce something, yes, we need one. Thanks! > > : > : I tried this way but it seems an interval instead of datetime. > : > : ``` > : > : tarantool> datetime.seconds(datetime.now().seconds) > : --- > : - +18823 days, 16 hours, 34 minutes, 10.283248901367 seconds > : ... > : > : ``` > : > : > : 9. Lua output doesn't support datetime > : > : ``` > : > : tarantool> \set output yaml > : --- > : - true > : ... > : > : tarantool> datetime.now() > : --- > : - 2021-07-15T19:46:15.797333+03:00 > : ... > : > : tarantool> \set output lua > : true; > : tarantool> datetime.now() > : nil; > : > : ``` > > Interesting, didn't know of that. Do you have any hints where it's > Implemented for, say, decimal, or uuid? https://github.com/tarantool/tarantool/blob/master/src/box/lua/serialize_lua.c > > : > : > : 10. You can export also the number of months/days in week as constansts. > : > : Probably it could be useful to make something like: > : > : ``` > : datetime_object:set('month', datetime.months.JANUARY) > : > : ``` > > Hmm, hmm. Need to discuss with others. Didn't see so much details exported > in python or perl datetime modules. How frequently you needed such > functionality from icu-date? I can't anser this question. Because we just provide some interfaces for our customers that is actually wrappers over icu-date. As I can see there are several function that uses it. There is one of them: ``` -- Returns the start of the current UTC date (zero hours, minutes, seconds, etc.) -- The result is in nanoseconds local function curr_date_nsec() local date = get_icu_date_instance() date:set_millis(date:now()) local year = date:get(icu_date.fields.YEAR) local month = date:get(icu_date.fields.MONTH) local day_of_month = date:get(icu_date.fields.DAY_OF_MONTH) date:set_millis(0) date:set(icu_date.fields.YEAR, year) date:set(icu_date.fields.MONTH, month) date:set(icu_date.fields.DAY_OF_MONTH, day_of_month) return date:get_millis() * NSEC_IN_MILLISEC end ``` However here we need to just strip datetime to just date. Also it seems that getters are used in more intensive way: ``` local function nsec_to_day_of_week(nsec) checks("number|cdata") local millis = to_milliseconds(nsec) local date = get_icu_date_instance() date:set_millis(millis) return date:get(icu_date.fields.DAY_OF_WEEK) end local function parse_unix_time(nsec) checks("number|cdata") local millis = to_milliseconds(nsec) local date = get_icu_date_instance() date:set_millis(millis) return { year = date:get(icu_date.fields.YEAR), month = date:get(icu_date.fields.MONTH) + 1, -- starts with 0 day = date:get(icu_date.fields.DAY_OF_MONTH), } end ``` > > : > : > : It was brief feedback as from (I hope) future customer of this module. > : > : If I've found another interface issues I'll give you feedback in next > : e-mails. > : > : I didn't see code itself if you need it I can review this patchset in > : more detailed way. > > That would be interesting to hear, thanks in advance! > > Timur > I think I'll do it on the next iteration of this patch. Thanks for your work on it.
next prev parent reply other threads:[~2021-07-16 6:58 UTC|newest] Thread overview: 19+ messages / expand[flat|nested] mbox.gz Atom feed top 2021-07-15 8:18 Timur Safin via Tarantool-patches 2021-07-15 8:18 ` [Tarantool-patches] [RFC PATCH 01/13] build: add Christian Hansen c-dt to the build Timur Safin via Tarantool-patches 2021-07-15 8:18 ` [Tarantool-patches] [RFC PATCH 02/13] lua: built-in module datetime Timur Safin via Tarantool-patches 2021-07-15 8:18 ` [Tarantool-patches] [RFC PATCH 03/13] test: datetime test Timur Safin via Tarantool-patches 2021-07-15 8:18 ` [Tarantool-patches] [RFC PATCH 04/13] test: datetime string formatting Timur Safin via Tarantool-patches 2021-07-15 8:18 ` [Tarantool-patches] [RFC PATCH 05/13] box: add messagepack support for datetime Timur Safin via Tarantool-patches 2021-07-15 8:18 ` [Tarantool-patches] [RFC PATCH 06/13] lua: positive/negative cases in datetime test Timur Safin via Tarantool-patches 2021-07-15 8:18 ` [Tarantool-patches] [RFC PATCH 07/13] lua: asctime and strfime fixed Timur Safin via Tarantool-patches 2021-07-15 8:18 ` [Tarantool-patches] [RFC PATCH 08/13] box, lua: renamed t_datetime_tz structure to datetime_t Timur Safin via Tarantool-patches 2021-07-15 8:18 ` [Tarantool-patches] [RFC PATCH 09/13] lua: calculated attributes for date Timur Safin via Tarantool-patches 2021-07-15 8:18 ` [Tarantool-patches] [RFC PATCH 10/13] lua: tostring formatization in datetime.lua Timur Safin via Tarantool-patches 2021-07-15 8:18 ` [Tarantool-patches] [RFC PATCH 11/13] test: allow relaxed date format without tz Timur Safin via Tarantool-patches 2021-07-15 8:18 ` [Tarantool-patches] [RFC PATCH 12/13] lua: initial time duration support Timur Safin via Tarantool-patches 2021-07-15 8:18 ` [Tarantool-patches] [RFC PATCH 13/13] lua: complete " Timur Safin via Tarantool-patches 2021-07-15 16:56 ` [Tarantool-patches] [RFC PATCH 00/13] Initial datetime support Oleg Babin via Tarantool-patches 2021-07-15 23:03 ` Timur Safin via Tarantool-patches 2021-07-16 6:58 ` Oleg Babin via Tarantool-patches [this message] 2021-07-22 10:01 ` Igor Munkin via Tarantool-patches 2021-07-22 12:54 ` Timur Safin via Tarantool-patches
Reply instructions: You may reply publicly to this message via plain-text email using any one of the following methods: * Save the following mbox file, import it into your mail client, and reply-to-all from there: mbox Avoid top-posting and favor interleaved quoting: https://en.wikipedia.org/wiki/Posting_style#Interleaved_style * Reply using the --to, --cc, and --in-reply-to switches of git-send-email(1): git send-email \ --in-reply-to=e1cbb1c6-fd54-ac3a-1dfc-2d877b58e74a@tarantool.org \ --to=tarantool-patches@dev.tarantool.org \ --cc=olegrok@tarantool.org \ --cc=tsafin@tarantool.org \ --subject='Re: [Tarantool-patches] [RFC PATCH 00/13] Initial datetime support' \ /path/to/YOUR_REPLY https://kernel.org/pub/software/scm/git/docs/git-send-email.html * If your mail client supports setting the In-Reply-To header via mailto: links, try the mailto: link
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox