{"id":33,"date":"2021-09-01T21:11:50","date_gmt":"2021-09-01T19:11:50","guid":{"rendered":"https:\/\/www.andrearibuoli.it\/wp\/?p=33"},"modified":"2021-09-03T17:44:10","modified_gmt":"2021-09-03T15:44:10","slug":"timestamp","status":"publish","type":"post","link":"https:\/\/www.andrearibuoli.it\/wp\/2021\/09\/01\/timestamp\/","title":{"rendered":"Timestamp"},"content":{"rendered":"\n<p>Tra le note IBM sul formato *DTS (menzionate in un precedente post) troviamo:<\/p>\n\n\n\n<blockquote class=\"wp-block-quote\"><p><em>When converting an input date from a *DTS timestamp format to an output date of any format without time zone conversion, the supported date range is from <span class=\"has-inline-color has-accent-color\">August 23, 1928, 12:03:06.314752<\/span> (.315 for milliseconds) to <span class=\"has-inline-color has-accent-color\">May 10, 2071, 11:56:53.685240<\/span> (.685 for milliseconds).<\/em><\/p><\/blockquote>\n\n\n\n<p>e poco dopo:<\/p>\n\n\n\n<blockquote class=\"wp-block-quote\"><p><em>When converting a character date and time value to *DTS and back to character format using microseconds precision, there is a rounding error of minus 1 to minus 7 microseconds.<br>If you specify a precision of microseconds, it is recommended that you <span class=\"has-inline-color has-accent-color\">use a microsecond value that is evenly divisible by 8<\/span>.<\/em><\/p><\/blockquote>\n\n\n\n<p>Si potrebbe ipotizzare che <code>X'0000000000000001<\/code>&#8216; valga 8 microsecondi per spiegare questo errore di arrotondamento. Ma facendo qualche conto si verifica che non pu\u00f2 essere.<\/p>\n\n\n\n<p>Sia <code>x<\/code> il valore utilizzato per rappresentare 8 microsecondi. Conseguentemente:<br><\/p>\n\n\n\n<ul><li>Il valore <code>125.000 * x<\/code> rappresenterebbe un milione di microsecondi, ossia 1 secondo. <\/li><li>Il valore <code>450.000.000 * x<\/code> rappresenterebbe un ora (3600 secondi).<\/li><li>Il valore <code>10.800.000.000 * x<\/code> rappresenterebbe un giorno (24 ore).<\/li><\/ul>\n\n\n\n<p>Tra il <span class=\"has-inline-color has-accent-color\">23 Agosto 1928<\/span> e il <span class=\"has-inline-color has-accent-color\">10 Maggio 2071<\/span> intercorrono <code>52.126<\/code> giorni.<\/p>\n\n\n\n<p>Volendo cavillare ed avere un valore esatto dell&#8217;intervallo temporale dobbiamo sottrarre la differenza tra gli orari:<br>12:03:06.314752 &#8211; 11:56:53.685240 = 00:06:12.629512<\/p>\n\n\n\n<p>Da cui: <\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">(52126 * 10.800.000.000 - (125.000 * 372 + 78689) ) * x =\n(562.960.800.000.000 - 46.578.689) * x =\n 562.960.753.421.311 * x<\/pre>\n\n\n\n<p>Ora:<\/p>\n\n\n\n<pre id=\"block-13ff5bc2-40bd-4c80-8533-d0e4761e0e3a\" class=\"wp-block-preformatted\">2^64 \/ 562.960.753.421.311 = 32.767,371<\/pre>\n\n\n\n<p>poich\u00e9 <code>32767 = 0x7FFF<\/code> il valore pi\u00f9 plausibile per <code>x<\/code> \u00e8 <code>X'0000000000008000'<\/code><br><\/p>\n\n\n\n<p><em>Ogni 8 microsecondi avremmo un incremento di <code>X'8000'<\/code>.<\/em><\/p>\n\n\n\n<p>Quindi il sistema di conversione date da (e per) il formato *DTS utilizzerebbe a rigore solo 6 * 8 + 1 = 49 bit dei 64 a disposizione per trattare i timestamp (prima della versione V4R3 del sistema operativo i bit utilizzati erano 41).<\/p>\n\n\n\n<p>Tuttavia i valori destinati ai timestamp nel savefile sembrano utilizzare tutti gli otto byte a disposizione.<\/p>\n\n\n\n<p>La cosa pi\u00f9 ovvia \u00e8 ipotizzare che con i progressi dell&#8217;hardware si sia giunti (a livello di LIC) a gestire una granularit\u00e0 maggiore. Un&#8217;altra ipotesi \u00e8 che <strong>la materializzazione del clock<\/strong>, essendo una <em>operazione software oltre che hardware<\/em>, sia strutturata proprio per garantire che due chiamate successive non possano restituire uno stesso valore (gestendo una rotazione dei valori associati ai bit meno significativi ossia quelli non determinabili dal clock vero e proprio).<\/p>\n\n\n\n<p><br>Comunque sia, se venissero gestiti completamente i microsecondi sfrutteremmo a pieno <strong>altri 3 bit<\/strong>: 52 bit dei 64 a disposizione<\/p>\n\n\n\n<p><code>X'000000000001000' = 1<\/code> microsecondo.<\/p>\n\n\n\n<p>Curiosando nella <a href=\"https:\/\/www.ibm.com\/docs\/en\/i\/7.4?topic=interface-machine-introduction#MININ__HDRTIMEFMT\">documentazione IBM<\/a> troviamo la risposta. A livello di sistema operativo IBM i 7.4 i bit utilizzati sono <strong>proprio <\/strong>52. <\/p>\n\n\n\n<p>Troviamo anche una spiegazione circa i bit apparentemente inutilizzati:<\/p>\n\n\n\n<blockquote class=\"wp-block-quote\"><p>The\u00a0<strong>uniqueness bits<\/strong>\u00a0field may contain any combination of binary <code>1<\/code>s and <code>0<\/code>s. These bits do not provide additional granularity for a time value; they merely allow unique 64-bit values to be returned, such as when the value of the\u00a0<em>time-of-day (TOD) clock<\/em>\u00a0is materialized. When the\u00a0<em>uniqueness bits<\/em>\u00a0all contain binary <code>0<\/code>s, then the 64-bit value returned is not unique. Unless explicitly stated otherwise, MI instructions which materialize the\u00a0<em>TOD clock<\/em>\u00a0return a unique 64-bit value.<\/p><\/blockquote>\n\n\n\n<p>Aggiungendo <strong>altri 10 bit<\/strong> potremmo gestire 1024 valori diversi per ogni microsecondo: <em>con 62 bit avremo allora superato la granularit\u00e0 necessaria per gestire effettivamente i <strong>nanosecondi<\/strong><\/em>.<\/p>\n\n\n\n<p>Numericamente avremmo comunque un dubbio su come siano gestiti i bit meno significativi.<\/p>\n\n\n\n<p>Con un poco di impegno possiamo scrivere una routine in C che decodifichi i timestamp estratti dai savefile una volta che gli stessi siano stati trasferiti su altra piattaforma.<\/p>\n\n\n\n<p>Quello effettivamente mostrato nel DSPSAVF (tasto funzione F16) \u00e8 presente nella parte fissa dell&#8217;associated space:<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">000000000 02 49 c5 d4 d7 e3 e8 40 40 40 40 40 40 40 40 40\n000000010 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40\n000000020 04 01 <span class=\"has-inline-color has-accent-color\"><strong>a6 d7 9a 5b 0d 5a e0 01<\/strong><\/span> 00 00 00 01 00 00\n000000030 00 00 01 40 40 ** ** ** ** ** ** ** 00 00 5c e2 \n000000040 e8 e2 e5 c1 d3 40 40 40 00 00 00 00 d5 00 01 00 000000050 5c e2 e8 e2 c2 c1 e2 40 40 40 00 5c d5 d6 d5 c5 000000060 40 40 40 40 40 ** ** ** ** ** ** ** ** 00 00 00<\/pre>\n\n\n\n<p>Una ultima curiosit\u00e0. Tra il valore <code>X'0000000000000001'<\/code> e il valore <code>X'FFFFFFFFFFFFFFFF' <\/code>esiste il valore <code>X'8000000000000000'<\/code>. A che data corrisponde? <\/p>\n\n\n\n<p>In altri termini: quale \u00e8 la data intermedia tra il <span class=\"has-inline-color has-accent-color\">23 Agosto 1928<\/span> e il <span class=\"has-inline-color has-accent-color\">10 Maggio 2071<\/span> nel formato *DTS? <\/p>\n","protected":false},"excerpt":{"rendered":"<p>Tra le note IBM sul formato *DTS (menzionate in un precedente post) troviamo: When converting an input date from a *DTS timestamp format to an output date of any format without time zone conversion, the supported date range is from August 23, 1928, 12:03:06.314752 (.315 for milliseconds) to May 10, 2071, 11:56:53.685240 (.685 for milliseconds). [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":[],"categories":[1],"tags":[],"_links":{"self":[{"href":"https:\/\/www.andrearibuoli.it\/wp\/wp-json\/wp\/v2\/posts\/33"}],"collection":[{"href":"https:\/\/www.andrearibuoli.it\/wp\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.andrearibuoli.it\/wp\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.andrearibuoli.it\/wp\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.andrearibuoli.it\/wp\/wp-json\/wp\/v2\/comments?post=33"}],"version-history":[{"count":9,"href":"https:\/\/www.andrearibuoli.it\/wp\/wp-json\/wp\/v2\/posts\/33\/revisions"}],"predecessor-version":[{"id":43,"href":"https:\/\/www.andrearibuoli.it\/wp\/wp-json\/wp\/v2\/posts\/33\/revisions\/43"}],"wp:attachment":[{"href":"https:\/\/www.andrearibuoli.it\/wp\/wp-json\/wp\/v2\/media?parent=33"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.andrearibuoli.it\/wp\/wp-json\/wp\/v2\/categories?post=33"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.andrearibuoli.it\/wp\/wp-json\/wp\/v2\/tags?post=33"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}