Many hyperlinks are disabled.
Use anonymous login
to enable hyperlinks.
Overview
Comment: | format: add support of new JDN-tokens (calendar JD `%EJ`, astronomical JD `%Ej`) with time fraction. |
---|---|
Downloads: | Tarball | ZIP archive |
Timelines: | family | ancestors | descendants | both | clock-astronomical-jdn |
Files: | files | file ages | folders |
SHA3-256: |
2194d065f7a6b8d0af3510abaa543973 |
User & Date: | sebres 2019-03-13 00:24:25.518 |
Context
2019-03-13
| ||
00:24 | scan: all JDN/JD are signed, so allow parse negative Julian days Closed-Leaf check-in: 7be9cada94 user: sebres tags: clock-astronomical-jdn | |
00:24 | format: add support of new JDN-tokens (calendar JD `%EJ`, astronomical JD `%Ej`) with time fraction.... check-in: 2194d065f7 user: sebres tags: clock-astronomical-jdn | |
00:23 | scan: extended with token `%EJ` to scan calendar julian day with time fraction (in opposite to astro... check-in: 9095503f61 user: sebres tags: clock-astronomical-jdn | |
Changes
Changes to generic/tclClockFmt.c.
︙ | ︙ | |||
2660 2661 2662 2663 2664 2665 2666 2667 2668 2669 2670 2671 2672 2673 | dow = 0; } dow++; } *val = ( dateFmt->date.dayOfYear - dow + 7 ) / 7; return TCL_OK; } static int ClockFmtToken_TimeZone_Proc( ClockFmtScnCmdArgs *opts, DateFormat *dateFmt, ClockFormatToken *tok, int *val) { | > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 2660 2661 2662 2663 2664 2665 2666 2667 2668 2669 2670 2671 2672 2673 2674 2675 2676 2677 2678 2679 2680 2681 2682 2683 2684 2685 2686 2687 2688 2689 2690 2691 2692 2693 2694 2695 2696 2697 2698 2699 2700 2701 2702 2703 2704 2705 2706 2707 2708 2709 2710 2711 2712 2713 2714 2715 2716 2717 2718 2719 2720 2721 2722 2723 2724 2725 2726 2727 2728 2729 2730 2731 2732 2733 2734 | dow = 0; } dow++; } *val = ( dateFmt->date.dayOfYear - dow + 7 ) / 7; return TCL_OK; } static int ClockFmtToken_JDN_Proc( ClockFmtScnCmdArgs *opts, DateFormat *dateFmt, ClockFormatToken *tok, int *val) { Tcl_WideInt intJD = dateFmt->date.julianDay; int fractJD; /* Convert to JDN parts (regarding start offset) and time fraction */ fractJD = dateFmt->date.secondOfDay - (int)tok->map->offs; /* 0 for calendar or 43200 for astro JD */ if (fractJD < 0) { intJD--; fractJD += SECONDS_PER_DAY; } if (fractJD && intJD < 0) { /* avoid jump over 0, by negative JD's */ intJD++; if (intJD == 0) { /* -0.0 / -0.9 has zero integer part, so append "-" extra */ if (FrmResultAllocate(dateFmt, 1) != TCL_OK) { return TCL_ERROR; }; *dateFmt->output++ = '-'; } /* and inverse seconds of day, -0(75) -> -0.25 as float */ fractJD = SECONDS_PER_DAY - fractJD; } /* 21 is max width of (negative) wide-int (rather smaller, but anyway a time fraction below) */ if (FrmResultAllocate(dateFmt, 21) != TCL_OK) { return TCL_ERROR; }; dateFmt->output = _witoaw(dateFmt->output, intJD, '0', 1); /* simplest cases .0 and .5 */ if (!fractJD || fractJD == (SECONDS_PER_DAY / 2)) { /* point + 0 or 5 */ if (FrmResultAllocate(dateFmt, 1+1) != TCL_OK) { return TCL_ERROR; }; *dateFmt->output++ = '.'; *dateFmt->output++ = !fractJD ? '0' : '5'; *dateFmt->output = '\0'; return TCL_OK; } else { /* wrap the time fraction */ #define JDN_MAX_PRECISION 8 #define JDN_MAX_PRECBOUND 100000000 /* 10**JDN_MAX_PRECISION */ char *p; /* to float (part after floating point, + 0.5 to round it up) */ fractJD = (int)( (double)fractJD * JDN_MAX_PRECBOUND / SECONDS_PER_DAY + 0.5 ); /* point + integer (as time fraction after floating point) */ if (FrmResultAllocate(dateFmt, 1+JDN_MAX_PRECISION) != TCL_OK) { return TCL_ERROR; }; *dateFmt->output++ = '.'; p = _itoaw(dateFmt->output, fractJD, '0', JDN_MAX_PRECISION); /* remove trailing zero's */ dateFmt->output++; while (p > dateFmt->output && *(p-1) == '0') {p--;} *p = '\0'; dateFmt->output = p; } return TCL_OK; } static int ClockFmtToken_TimeZone_Proc( ClockFmtScnCmdArgs *opts, DateFormat *dateFmt, ClockFormatToken *tok, int *val) { |
︙ | ︙ | |||
2896 2897 2898 2899 2900 2901 2902 | }; static const char *FmtSTokenMapAliasIndex[2] = { "hPWZ", "bpUz" }; static const char *FmtETokenMapIndex = | | > > > > > > | 2957 2958 2959 2960 2961 2962 2963 2964 2965 2966 2967 2968 2969 2970 2971 2972 2973 2974 2975 2976 2977 2978 2979 2980 2981 | }; static const char *FmtSTokenMapAliasIndex[2] = { "hPWZ", "bpUz" }; static const char *FmtETokenMapIndex = "EJjys"; static ClockFormatTokenMap FmtETokenMap[] = { /* %EE */ {CFMTT_PROC, NULL, 0, 0, 0, 0, 0, ClockFmtToken_LocaleERA_Proc, NULL}, /* %EJ */ {CFMTT_PROC, NULL, 0, 0, 0, 0, 0, /* calendar JDN starts at midnight */ ClockFmtToken_JDN_Proc, NULL}, /* %Ej */ {CFMTT_PROC, NULL, 0, 0, 0, 0, (SECONDS_PER_DAY/2), /* astro JDN starts at noon */ ClockFmtToken_JDN_Proc, NULL}, /* %Ey %EC */ {CTOKT_INT, NULL, 0, 0, 0, 0, TclOffset(DateFormat, date.year), ClockFmtToken_LocaleERAYear_Proc, NULL}, /* %Es */ {CTOKT_WIDE, "0", 1, 0, 0, 0, TclOffset(DateFormat, date.localSeconds), NULL}, }; static const char *FmtETokenMapAliasIndex[2] = { |
︙ | ︙ |
Changes to tests/clock.test.
︙ | ︙ | |||
15354 15355 15356 15357 15358 15359 15360 | test clock-4.96 { format time of day 23:59:59 } { clock format 86399 \ -format {%H %OH %I %OI %k %Ok %l %Ol %M %OM %p %P %r %R %S %OS %T %X %EX %+} \ -locale en_US_roman \ -gmt true } {23 xxiii 11 xi 23 xxiii 11 xi 59 lix PM pm 11:59:59 pm 23:59 59 lix 23:59:59 23:59:59 xxiii h lix m lix s Thu Jan 1 23:59:59 GMT 1970} | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | 15354 15355 15356 15357 15358 15359 15360 15361 15362 15363 15364 15365 15366 15367 15368 15369 15370 15371 15372 15373 15374 15375 15376 15377 15378 15379 15380 15381 15382 15383 15384 15385 15386 15387 15388 15389 15390 15391 15392 15393 15394 15395 15396 15397 15398 15399 15400 15401 15402 15403 15404 15405 15406 15407 15408 15409 15410 15411 15412 15413 15414 15415 15416 15417 15418 15419 15420 15421 15422 15423 15424 15425 15426 15427 15428 15429 15430 15431 15432 15433 15434 15435 15436 15437 15438 15439 15440 15441 15442 | test clock-4.96 { format time of day 23:59:59 } { clock format 86399 \ -format {%H %OH %I %OI %k %Ok %l %Ol %M %OM %p %P %r %R %S %OS %T %X %EX %+} \ -locale en_US_roman \ -gmt true } {23 xxiii 11 xi 23 xxiii 11 xi 59 lix PM pm 11:59:59 pm 23:59 59 lix 23:59:59 23:59:59 xxiii h lix m lix s Thu Jan 1 23:59:59 GMT 1970} test clock-4.97.1 { format JDN/JD (calendar and astronomical) } { clock format 0 -format {%J %EJ %Ej} -gmt true } {2440588 2440588.0 2440587.5} test clock-4.97.2 { format JDN/JD (calendar and astronomical) } { clock format 43200 -format {%J %EJ %Ej} -gmt true } {2440588 2440588.5 2440588.0} test clock-4.97.3 { format JDN/JD (calendar and astronomical) } { clock format 86399 -format {%J %EJ %Ej} -gmt true } {2440588 2440588.99998843 2440588.49998843} test clock-4.97.4 { format JDN/JD (calendar and astronomical) } { clock format 86400 -format {%J %EJ %Ej} -gmt true } {2440589 2440589.0 2440588.5} test clock-4.97.5 { format JDN/JD (calendar and astronomical) } { clock format 129599 -format {%J %EJ %Ej} -gmt true } {2440589 2440589.49998843 2440588.99998843} test clock-4.97.6 { format JDN/JD (calendar and astronomical) } { clock format 129600 -format {%J %EJ %Ej} -gmt true } {2440589 2440589.5 2440589.0} test clock-4.97.7 { format JDN/JD (calendar and astronomical) } { set i 1548249092 list \ [clock format $i -format {%J %EJ %Ej} -gmt true] \ [clock format [incr i] -format {%J %EJ %Ej} -gmt true] \ [clock format [incr i] -format {%J %EJ %Ej} -gmt true] } {{2458507 2458507.54967593 2458507.04967593} {2458507 2458507.5496875 2458507.0496875} {2458507 2458507.54969907 2458507.04969907}} test clock-4.97.8 { format JDN/JD (calendar and astronomical) } { set res {} foreach i { -172800 -129600 -86400 -43200 -1 0 1 21600 43199 43200 86399 86400 86401 108000 129600 172800 } { lappend res $i [clock format [expr -210866803200 - $i] \ -format {%EE %Y-%m-%d %T -- %J %EJ %Ej} -gmt true] } set res } [list \ -172800 {B.C.E. 4713-01-03 00:00:00 -- 0000002 2.0 1.5} \ -129600 {B.C.E. 4713-01-02 12:00:00 -- 0000001 1.5 1.0} \ -86400 {B.C.E. 4713-01-02 00:00:00 -- 0000001 1.0 0.5} \ -43200 {B.C.E. 4713-01-01 12:00:00 -- 0000000 0.5 0.0} \ -1 {B.C.E. 4713-01-01 00:00:01 -- 0000000 0.00001157 -0.49998843} \ 0 {B.C.E. 4713-01-01 00:00:00 -- 0000000 0.0 -0.5} \ 1 {B.C.E. 4714-12-31 23:59:59 -- -000001 -0.00001157 -0.50001157} \ 21600 {B.C.E. 4714-12-31 18:00:00 -- -000001 -0.25 -0.75} \ 43199 {B.C.E. 4714-12-31 12:00:01 -- -000001 -0.49998843 -0.99998843} \ 43200 {B.C.E. 4714-12-31 12:00:00 -- -000001 -0.5 -1.0} \ 86399 {B.C.E. 4714-12-31 00:00:01 -- -000001 -0.99998843 -1.49998843} \ 86400 {B.C.E. 4714-12-31 00:00:00 -- -000001 -1.0 -1.5} \ 86401 {B.C.E. 4714-12-30 23:59:59 -- -000002 -1.00001157 -1.50001157} \ 108000 {B.C.E. 4714-12-30 18:00:00 -- -000002 -1.25 -1.75} \ 129600 {B.C.E. 4714-12-30 12:00:00 -- -000002 -1.5 -2.0} \ 172800 {B.C.E. 4714-12-30 00:00:00 -- -000002 -2.0 -2.5} \ ] test clock-4.97.9 { format JDN/JD (calendar and astronomical) } { set res {} foreach i { -86400 -43200 -1 0 1 43199 43200 43201 86400 } { lappend res $i [clock format [expr 653133196800 + $i] \ -format {%Y-%m-%d %T -- %J %EJ %Ej} -gmt true] } set res } [list \ -86400 {22666-12-19 00:00:00 -- 9999999 9999999.0 9999998.5} \ -43200 {22666-12-19 12:00:00 -- 9999999 9999999.5 9999999.0} \ -1 {22666-12-19 23:59:59 -- 9999999 9999999.99998843 9999999.49998843} \ 0 {22666-12-20 00:00:00 -- 10000000 10000000.0 9999999.5} \ 1 {22666-12-20 00:00:01 -- 10000000 10000000.00001157 9999999.50001157} \ 43199 {22666-12-20 11:59:59 -- 10000000 10000000.49998843 9999999.99998843} \ 43200 {22666-12-20 12:00:00 -- 10000000 10000000.5 10000000.0} \ 43201 {22666-12-20 12:00:01 -- 10000000 10000000.50001157 10000000.00001157} \ 86400 {22666-12-21 00:00:00 -- 10000001 10000001.0 10000000.5} \ ] # END testcases4 # BEGIN testcases5 # Test formatting of Daylight Saving Time |
︙ | ︙ |