Template:YMD2MJD/2

From Meta, a Wikimedia project coordination wiki
Jump to navigation Jump to search

This auxiliary template allows template:YMD2MJD (edittalklinkshistory) to operate on a single "{{CURRENTTIMESTAMP|=}}" gives "Template:CURRENTTIMESTAMP" [1] without risk of critical races:
58743

Usage: {{YMD2MJD/2|YYYYMMDDhhmmss}}, only nonnegative whole numbers, no error handling.



Legend for the following simplification
y = year, can be zero (1 BC) or negative (2 BC etc.)
m = month 1..12, leading zero not required
d = similar day 1..31
hh = hours (3600 seconds), any value for non-negative total
mm = minutes (60 seconds), any value for non-negative total
ss = seconds, any value for non-negative total seconds
now = current timestamp ymdhhmmss (string)
ymd = date, 0 < m <= 12 and 0 < d <= 31
T( p q )   = template {{ ''T'' | ''p'' | ''q'' }}
p + q = {{ #expr: p + q }}
Related templates, old state
MJD(y m d hh mm ss) = YMD2MJD(y m d)+dectime(hh mm ss)
MJD( ) = Timestamp2MJD( now )
Timestamp2MJD(ymdhhmmss) = YMD2MJD(y m d)+dectime(hh mm ss)
dectime(hh mm ss) = computed inline
YMD2MJD(y m d) = computed inline
dectime( ) = dectime/2( now )
YMD2MJD( ) = YMD2MJD/2( now )
dectime/2( ymdhhmmss ) = computed inline ignoring ymd
YMD2MJD/2( ymdhhmmss ) = computed inline ignoring hhmmss

It's not possible to replace dectime(hh mm ss) by dectime/2(hhmmss) generally: dectime accepts any numerical value for hh mm ss, while dectime/2 is for strings of in essence six digits hhmmss, where signs, fractions, or missing zeros could cause havoc.

Likewise replacing YMD2MJD everywhere by YMD2MJD/2 won't work. The purpose of YMD2MJD/2 and dectime/2 is to evaluate CURRENTTIMESTAMP only once avoiding race conditions for second 59 and the next minute.

Some simplifications were still possible: Timestamp2MJD didn't need the error handling of YMD2MJD, it could use YMD2MJD/2. For similar reasons it could use dectime/2 instead of dectime. With those modifications we got:

Related templates, intermediate state
MJD(y m d hh mm ss) = YMD2MJD(y m d)+dectime(hh mm ss)
MJD( ) = Timestamp2MJD( now )
Timestamp2MJD(ymdhhmmss) = YMD2MJD/2(ymdhhmmss)+dectime(ymdhhmmss)
dectime(hh mm ss) = computed inline
YMD2MJD(y m d) = computed inline
dectime( ) = dectime/2( now )
YMD2MJD( ) = YMD2MJD/2( now )
dectime/2( ymdhhmmss ) = computed inline ignoring ymd
YMD2MJD/2( ymdhhmmss ) = computed inline ignoring hhmmss

Looking at the intermediate result it was possible to copy the code of dectime/2 and YMD2MJD/2 into Timestamp2MJD.

After that modification it's possible to replace the auxiliary templates by Timestamp2MJD in dectime and YMD2MJD. For that YMD2MJD has to use ymdhhmmss round -6, or in other words ymd000000, for the allowed non-negative timestamps, where 0 <= hh < 50 is guaranteed.

Similar dectime has to use ymdhhmmss mod 1000000 to get the desired decimal fraction between 0 and 1 excluding 1. Putting it all together without disrupting the working templates:

  1. Let Timestamp2MD use the code of the auxiliary /2 templates.
  2. Let YMD2MJD use Timestamp2MJD with round -6.
  3. Let dectime use Timestamp2MJD with mod 1000000.
  4. Remove the auxiliary templates from unrelated documentation.
Related templates, planned state
MJD(y m d hh mm ss) = YMD2MJD(y m d)+dectime(hh mm ss)
MJD( ) = Timestamp2MJD( now )
Timestamp2MJD(ymdhhmmss) = computed inline
dectime(hh mm ss) = computed inline
YMD2MJD(y m d) = computed inline
dectime( ) = Timetamp2MJD( now ) (mod 1000000)
YMD2MJD( ) = TimestampMJD( now ) (round -6)