karo 0.1.2

Spreadsheet export
Documentation
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
use super::{AsExcelDate, DateMode};
use chrono::{TimeZone, Utc};

fn check_datetime(
    year: i32,
    month: u32,
    day: u32,
    hour: u32,
    min: u32,
    sec: u32,
    milli: u32,
    expected: f64,
) {
    assert_eq!(
        Utc.ymd(year, month, day)
            .and_hms_milli(hour, min, sec, milli)
            .as_excel_date(DateMode::BasedOn1900),
        expected
    );
}

fn check_date(year: i32, month: u32, day: u32, expected: usize) {
    assert_eq!(
        Utc.ymd(year, month, day)
            .and_hms(0, 0, 0)
            .as_excel_date(DateMode::BasedOn1900),
        expected as f64
    );
}

#[test]
fn datetime_date_and_time() {
    check_datetime(1899, 12, 31, 0, 0, 0, 000, 0.0);
    check_datetime(1982, 8, 25, 0, 15, 20, 213, 30188.010650613425);
    check_datetime(2065, 4, 19, 0, 16, 48, 290, 60376.011670023145);
    check_datetime(2147, 12, 15, 0, 55, 25, 446, 90565.038488958337);
    check_datetime(2230, 8, 10, 1, 2, 46, 891, 120753.04359827546);
    check_datetime(2313, 4, 6, 1, 4, 15, 597, 150942.04462496529);
    check_datetime(2395, 11, 30, 1, 9, 40, 889, 181130.04838991899);
    check_datetime(2478, 7, 25, 1, 11, 32, 560, 211318.04968240741);
    check_datetime(2561, 3, 21, 1, 30, 19, 169, 241507.06272186342);
    check_datetime(2643, 11, 15, 1, 48, 25, 580, 271695.07529606484);
    check_datetime(2726, 7, 12, 2, 3, 31, 919, 301884.08578609955);
    check_datetime(2809, 3, 6, 2, 11, 11, 986, 332072.09111094906);
    check_datetime(2891, 10, 31, 2, 24, 37, 095, 362261.10042934027);
    check_datetime(2974, 6, 26, 2, 35, 7, 220, 392449.10772245371);
    check_datetime(3057, 2, 19, 2, 45, 12, 109, 422637.1147234838);
    check_datetime(3139, 10, 17, 3, 6, 39, 990, 452826.12962951389);
    check_datetime(3222, 6, 11, 3, 8, 8, 251, 483014.13065105322);
    check_datetime(3305, 2, 5, 3, 19, 12, 576, 513203.13834);
    check_datetime(3387, 10, 1, 3, 29, 42, 574, 543391.14563164348);
    check_datetime(3470, 5, 27, 3, 37, 30, 813, 573579.15105107636);
    check_datetime(3553, 1, 21, 4, 14, 38, 231, 603768.17683137732);
    check_datetime(3635, 9, 16, 4, 16, 28, 559, 633956.17810832174);
    check_datetime(3718, 5, 13, 4, 17, 58, 222, 664145.17914608796);
    check_datetime(3801, 1, 6, 4, 21, 41, 794, 694333.18173372687);
    check_datetime(3883, 9, 2, 4, 56, 35, 792, 724522.20596981479);
    check_datetime(3966, 4, 28, 5, 25, 14, 885, 754710.2258667245);
    check_datetime(4048, 12, 21, 5, 26, 5, 724, 784898.22645513888);
    check_datetime(4131, 8, 18, 5, 46, 44, 068, 815087.24078782403);
    check_datetime(4214, 4, 13, 5, 48, 1, 141, 845275.24167987274);
    check_datetime(4296, 12, 7, 5, 53, 52, 315, 875464.24574438657);
    check_datetime(4379, 8, 3, 6, 14, 48, 580, 905652.26028449077);
    check_datetime(4462, 3, 28, 6, 46, 15, 738, 935840.28212659725);
    check_datetime(4544, 11, 22, 7, 31, 20, 407, 966029.31343063654);
    check_datetime(4627, 7, 19, 7, 58, 33, 754, 996217.33233511576);
    check_datetime(4710, 3, 15, 8, 7, 43, 130, 1026406.3386936343);
    check_datetime(4792, 11, 7, 8, 29, 11, 091, 1056594.3536005903);
    check_datetime(4875, 7, 4, 9, 8, 15, 328, 1086783.3807329629);
    check_datetime(4958, 2, 27, 9, 30, 41, 781, 1116971.3963169097);
    check_datetime(5040, 10, 23, 9, 34, 4, 462, 1147159.3986627546);
    check_datetime(5123, 6, 20, 9, 37, 23, 945, 1177348.4009715857);
    check_datetime(5206, 2, 12, 9, 37, 56, 655, 1207536.4013501736);
    check_datetime(5288, 10, 8, 9, 45, 12, 230, 1237725.406391551);
    check_datetime(5371, 6, 4, 9, 54, 14, 782, 1267913.412671088);
    check_datetime(5454, 1, 28, 9, 54, 22, 108, 1298101.4127558796);
    check_datetime(5536, 9, 24, 10, 1, 36, 151, 1328290.4177795255);
    check_datetime(5619, 5, 20, 12, 9, 48, 602, 1358478.5068125231);
    check_datetime(5702, 1, 14, 12, 34, 8, 549, 1388667.5237100578);
    check_datetime(5784, 9, 8, 12, 56, 6, 495, 1418855.5389640625);
    check_datetime(5867, 5, 6, 12, 58, 58, 217, 1449044.5409515856);
    check_datetime(5949, 12, 30, 12, 59, 54, 263, 1479232.5416002662);
    check_datetime(6032, 8, 24, 13, 34, 41, 331, 1509420.5657561459);
    check_datetime(6115, 4, 21, 13, 58, 28, 601, 1539609.5822754744);
    check_datetime(6197, 12, 14, 14, 2, 16, 899, 1569797.5849178126);
    check_datetime(6280, 8, 10, 14, 36, 17, 444, 1599986.6085352316);
    check_datetime(6363, 4, 6, 14, 37, 57, 451, 1630174.60969272);
    check_datetime(6445, 11, 30, 14, 57, 42, 757, 1660363.6234115392);
    check_datetime(6528, 7, 26, 15, 10, 48, 307, 1690551.6325035533);
    check_datetime(6611, 3, 22, 15, 14, 39, 890, 1720739.635183912);
    check_datetime(6693, 11, 15, 15, 19, 47, 988, 1750928.6387498612);
    check_datetime(6776, 7, 11, 16, 4, 24, 344, 1781116.6697262037);
    check_datetime(6859, 3, 7, 16, 22, 23, 952, 1811305.6822216667);
    check_datetime(6941, 10, 31, 16, 29, 55, 999, 1841493.6874536921);
    check_datetime(7024, 6, 26, 16, 58, 20, 259, 1871681.7071789235);
    check_datetime(7107, 2, 21, 17, 4, 2, 415, 1901870.7111390624);
    check_datetime(7189, 10, 16, 17, 18, 29, 630, 1932058.7211762732);
    check_datetime(7272, 6, 11, 17, 47, 21, 323, 1962247.7412190163);
    check_datetime(7355, 2, 5, 17, 53, 29, 866, 1992435.7454845603);
    check_datetime(7437, 10, 2, 17, 53, 41, 076, 2022624.7456143056);
    check_datetime(7520, 5, 28, 17, 55, 6, 044, 2052812.7465977315);
    check_datetime(7603, 1, 21, 18, 14, 49, 151, 2083000.7602910995);
    check_datetime(7685, 9, 16, 18, 17, 45, 738, 2113189.7623349307);
    check_datetime(7768, 5, 12, 18, 29, 59, 700, 2143377.7708298611);
    check_datetime(7851, 1, 7, 18, 33, 21, 233, 2173566.773162419);
    check_datetime(7933, 9, 2, 19, 14, 24, 673, 2203754.8016744559);
    check_datetime(8016, 4, 27, 19, 17, 12, 816, 2233942.8036205554);
    check_datetime(8098, 12, 22, 19, 23, 36, 418, 2264131.8080603937);
    check_datetime(8181, 8, 17, 19, 46, 25, 908, 2294319.8239109721);
    check_datetime(8264, 4, 13, 20, 7, 47, 314, 2324508.8387420601);
    check_datetime(8346, 12, 8, 20, 31, 37, 603, 2354696.855296331);
    check_datetime(8429, 8, 3, 20, 39, 57, 770, 2384885.8610853008);
    check_datetime(8512, 3, 29, 20, 50, 17, 067, 2415073.8682530904);
    check_datetime(8594, 11, 22, 21, 2, 57, 827, 2445261.8770581828);
    check_datetime(8677, 7, 19, 21, 23, 5, 519, 2475450.8910360998);
    check_datetime(8760, 3, 14, 21, 34, 49, 572, 2505638.8991848612);
    check_datetime(8842, 11, 8, 21, 39, 5, 944, 2535827.9021521294);
    check_datetime(8925, 7, 4, 21, 39, 18, 426, 2566015.9022965971);
    check_datetime(9008, 2, 28, 21, 46, 7, 769, 2596203.9070343636);
    check_datetime(9090, 10, 24, 21, 57, 55, 662, 2626392.9152275696);
    check_datetime(9173, 6, 19, 22, 19, 11, 732, 2656580.9299968979);
    check_datetime(9256, 2, 13, 22, 23, 51, 376, 2686769.9332335186);
    check_datetime(9338, 10, 9, 22, 27, 58, 771, 2716957.9360968866);
    check_datetime(9421, 6, 5, 22, 43, 30, 392, 2747146.9468795368);
    check_datetime(9504, 1, 30, 22, 48, 25, 834, 2777334.9502990046);
    check_datetime(9586, 9, 24, 22, 53, 51, 727, 2807522.9540709145);
    check_datetime(9669, 5, 20, 23, 12, 56, 536, 2837711.9673210187);
    check_datetime(9752, 1, 14, 23, 15, 54, 109, 2867899.9693762613);
    check_datetime(9834, 9, 10, 23, 17, 12, 632, 2898088.9702850925);
    check_datetime(9999, 12, 31, 23, 59, 59, 000, 2958465.999988426);
}

#[test]
fn datetime_date_only() {
    check_date(1899, 12, 31, 0);
    check_date(1900, 1, 1, 1);
    check_date(1900, 2, 27, 58);
    check_date(1900, 2, 28, 59);
    check_date(1900, 3, 1, 61);
    check_date(1900, 3, 2, 62);
    check_date(1900, 3, 11, 71);
    check_date(1900, 4, 8, 99);
    check_date(1900, 9, 12, 256);
    check_date(1901, 5, 3, 489);
    check_date(1901, 10, 13, 652);
    check_date(1902, 2, 15, 777);
    check_date(1902, 6, 6, 888);
    check_date(1902, 9, 25, 999);
    check_date(1902, 9, 27, 1001);
    check_date(1903, 4, 26, 1212);
    check_date(1903, 8, 5, 1313);
    check_date(1903, 12, 31, 1461);
    check_date(1904, 1, 1, 1462);
    check_date(1904, 2, 28, 1520);
    check_date(1904, 2, 29, 1521);
    check_date(1904, 3, 1, 1522);
    check_date(1907, 2, 27, 2615);
    check_date(1907, 2, 28, 2616);
    check_date(1907, 3, 1, 2617);
    check_date(1907, 3, 2, 2618);
    check_date(1907, 3, 3, 2619);
    check_date(1907, 3, 4, 2620);
    check_date(1907, 3, 5, 2621);
    check_date(1907, 3, 6, 2622);
    check_date(1999, 1, 1, 36161);
    check_date(1999, 1, 31, 36191);
    check_date(1999, 2, 1, 36192);
    check_date(1999, 2, 28, 36219);
    check_date(1999, 3, 1, 36220);
    check_date(1999, 3, 31, 36250);
    check_date(1999, 4, 1, 36251);
    check_date(1999, 4, 30, 36280);
    check_date(1999, 5, 1, 36281);
    check_date(1999, 5, 31, 36311);
    check_date(1999, 6, 1, 36312);
    check_date(1999, 6, 30, 36341);
    check_date(1999, 7, 1, 36342);
    check_date(1999, 7, 31, 36372);
    check_date(1999, 8, 1, 36373);
    check_date(1999, 8, 31, 36403);
    check_date(1999, 9, 1, 36404);
    check_date(1999, 9, 30, 36433);
    check_date(1999, 10, 1, 36434);
    check_date(1999, 10, 31, 36464);
    check_date(1999, 11, 1, 36465);
    check_date(1999, 11, 30, 36494);
    check_date(1999, 12, 1, 36495);
    check_date(1999, 12, 31, 36525);
    check_date(2000, 1, 1, 36526);
    check_date(2000, 1, 31, 36556);
    check_date(2000, 2, 1, 36557);
    check_date(2000, 2, 29, 36585);
    check_date(2000, 3, 1, 36586);
    check_date(2000, 3, 31, 36616);
    check_date(2000, 4, 1, 36617);
    check_date(2000, 4, 30, 36646);
    check_date(2000, 5, 1, 36647);
    check_date(2000, 5, 31, 36677);
    check_date(2000, 6, 1, 36678);
    check_date(2000, 6, 30, 36707);
    check_date(2000, 7, 1, 36708);
    check_date(2000, 7, 31, 36738);
    check_date(2000, 8, 1, 36739);
    check_date(2000, 8, 31, 36769);
    check_date(2000, 9, 1, 36770);
    check_date(2000, 9, 30, 36799);
    check_date(2000, 10, 1, 36800);
    check_date(2000, 10, 31, 36830);
    check_date(2000, 11, 1, 36831);
    check_date(2000, 11, 30, 36860);
    check_date(2000, 12, 1, 36861);
    check_date(2000, 12, 31, 36891);
    check_date(2001, 1, 1, 36892);
    check_date(2001, 1, 31, 36922);
    check_date(2001, 2, 1, 36923);
    check_date(2001, 2, 28, 36950);
    check_date(2001, 3, 1, 36951);
    check_date(2001, 3, 31, 36981);
    check_date(2001, 4, 1, 36982);
    check_date(2001, 4, 30, 37011);
    check_date(2001, 5, 1, 37012);
    check_date(2001, 5, 31, 37042);
    check_date(2001, 6, 1, 37043);
    check_date(2001, 6, 30, 37072);
    check_date(2001, 7, 1, 37073);
    check_date(2001, 7, 31, 37103);
    check_date(2001, 8, 1, 37104);
    check_date(2001, 8, 31, 37134);
    check_date(2001, 9, 1, 37135);
    check_date(2001, 9, 30, 37164);
    check_date(2001, 10, 1, 37165);
    check_date(2001, 10, 31, 37195);
    check_date(2001, 11, 1, 37196);
    check_date(2001, 11, 30, 37225);
    check_date(2001, 12, 1, 37226);
    check_date(2001, 12, 31, 37256);
    check_date(2400, 1, 1, 182623);
    check_date(2400, 1, 31, 182653);
    check_date(2400, 2, 1, 182654);
    check_date(2400, 2, 29, 182682);
    check_date(2400, 3, 1, 182683);
    check_date(2400, 3, 31, 182713);
    check_date(2400, 4, 1, 182714);
    check_date(2400, 4, 30, 182743);
    check_date(2400, 5, 1, 182744);
    check_date(2400, 5, 31, 182774);
    check_date(2400, 6, 1, 182775);
    check_date(2400, 6, 30, 182804);
    check_date(2400, 7, 1, 182805);
    check_date(2400, 7, 31, 182835);
    check_date(2400, 8, 1, 182836);
    check_date(2400, 8, 31, 182866);
    check_date(2400, 9, 1, 182867);
    check_date(2400, 9, 30, 182896);
    check_date(2400, 10, 1, 182897);
    check_date(2400, 10, 31, 182927);
    check_date(2400, 11, 1, 182928);
    check_date(2400, 11, 30, 182957);
    check_date(2400, 12, 1, 182958);
    check_date(2400, 12, 31, 182988);
    check_date(4000, 1, 1, 767011);
    check_date(4000, 1, 31, 767041);
    check_date(4000, 2, 1, 767042);
    check_date(4000, 2, 29, 767070);
    check_date(4000, 3, 1, 767071);
    check_date(4000, 3, 31, 767101);
    check_date(4000, 4, 1, 767102);
    check_date(4000, 4, 30, 767131);
    check_date(4000, 5, 1, 767132);
    check_date(4000, 5, 31, 767162);
    check_date(4000, 6, 1, 767163);
    check_date(4000, 6, 30, 767192);
    check_date(4000, 7, 1, 767193);
    check_date(4000, 7, 31, 767223);
    check_date(4000, 8, 1, 767224);
    check_date(4000, 8, 31, 767254);
    check_date(4000, 9, 1, 767255);
    check_date(4000, 9, 30, 767284);
    check_date(4000, 10, 1, 767285);
    check_date(4000, 10, 31, 767315);
    check_date(4000, 11, 1, 767316);
    check_date(4000, 11, 30, 767345);
    check_date(4000, 12, 1, 767346);
    check_date(4000, 12, 31, 767376);
    check_date(4321, 1, 1, 884254);
    check_date(4321, 1, 31, 884284);
    check_date(4321, 2, 1, 884285);
    check_date(4321, 2, 28, 884312);
    check_date(4321, 3, 1, 884313);
    check_date(4321, 3, 31, 884343);
    check_date(4321, 4, 1, 884344);
    check_date(4321, 4, 30, 884373);
    check_date(4321, 5, 1, 884374);
    check_date(4321, 5, 31, 884404);
    check_date(4321, 6, 1, 884405);
    check_date(4321, 6, 30, 884434);
    check_date(4321, 7, 1, 884435);
    check_date(4321, 7, 31, 884465);
    check_date(4321, 8, 1, 884466);
    check_date(4321, 8, 31, 884496);
    check_date(4321, 9, 1, 884497);
    check_date(4321, 9, 30, 884526);
    check_date(4321, 10, 1, 884527);
    check_date(4321, 10, 31, 884557);
    check_date(4321, 11, 1, 884558);
    check_date(4321, 11, 30, 884587);
    check_date(4321, 12, 1, 884588);
    check_date(4321, 12, 31, 884618);
    check_date(9999, 1, 1, 2958101);
    check_date(9999, 1, 31, 2958131);
    check_date(9999, 2, 1, 2958132);
    check_date(9999, 2, 28, 2958159);
    check_date(9999, 3, 1, 2958160);
    check_date(9999, 3, 31, 2958190);
    check_date(9999, 4, 1, 2958191);
    check_date(9999, 4, 30, 2958220);
    check_date(9999, 5, 1, 2958221);
    check_date(9999, 5, 31, 2958251);
    check_date(9999, 6, 1, 2958252);
    check_date(9999, 6, 30, 2958281);
    check_date(9999, 7, 1, 2958282);
    check_date(9999, 7, 31, 2958312);
    check_date(9999, 8, 1, 2958313);
    check_date(9999, 8, 31, 2958343);
    check_date(9999, 9, 1, 2958344);
    check_date(9999, 9, 30, 2958373);
    check_date(9999, 10, 1, 2958374);
    check_date(9999, 10, 31, 2958404);
    check_date(9999, 11, 1, 2958405);
    check_date(9999, 11, 30, 2958434);
    check_date(9999, 12, 1, 2958435);
    check_date(9999, 12, 31, 2958465);
}

/* TODO: implement these tests from libxlsxwriter

CTEST(utility, _datetime_date_only_1904) {

    double got;
    lxw_datetime *datetime;

    // Params = (year, month, day, excel_date).
    TEST_DATETIME_DATE_1904(1904,  1,  1, 0);
    TEST_DATETIME_DATE_1904(1904,  1, 31, 30);
    TEST_DATETIME_DATE_1904(1904,  2,  1, 31);
    TEST_DATETIME_DATE_1904(1904,  2, 29, 59);
    TEST_DATETIME_DATE_1904(1904,  3,  1, 60);
    TEST_DATETIME_DATE_1904(1904,  3, 31, 90);
    TEST_DATETIME_DATE_1904(1904,  4,  1, 91);
    TEST_DATETIME_DATE_1904(1904,  4, 30, 120);
    TEST_DATETIME_DATE_1904(1904,  5,  1, 121);
    TEST_DATETIME_DATE_1904(1904,  5, 31, 151);
    TEST_DATETIME_DATE_1904(1904,  6,  1, 152);
    TEST_DATETIME_DATE_1904(1904,  6, 30, 181);
    TEST_DATETIME_DATE_1904(1904,  7,  1, 182);
    TEST_DATETIME_DATE_1904(1904,  7, 31, 212);
    TEST_DATETIME_DATE_1904(1904,  8,  1, 213);
    TEST_DATETIME_DATE_1904(1904,  8, 31, 243);
    TEST_DATETIME_DATE_1904(1904,  9,  1, 244);
    TEST_DATETIME_DATE_1904(1904,  9, 30, 273);
    TEST_DATETIME_DATE_1904(1904, 10,  1, 274);
    TEST_DATETIME_DATE_1904(1904, 10, 31, 304);
    TEST_DATETIME_DATE_1904(1904, 11,  1, 305);
    TEST_DATETIME_DATE_1904(1904, 11, 30, 334);
    TEST_DATETIME_DATE_1904(1904, 12,  1, 335);
    TEST_DATETIME_DATE_1904(1904, 12, 31, 365);
    TEST_DATETIME_DATE_1904(1907,  2, 27, 1153);
    TEST_DATETIME_DATE_1904(1907,  2, 28, 1154);
    TEST_DATETIME_DATE_1904(1907,  3,  1, 1155);
    TEST_DATETIME_DATE_1904(1907,  3,  2, 1156);
    TEST_DATETIME_DATE_1904(1907,  3,  3, 1157);
    TEST_DATETIME_DATE_1904(1907,  3,  4, 1158);
    TEST_DATETIME_DATE_1904(1907,  3,  5, 1159);
    TEST_DATETIME_DATE_1904(1907,  3,  6, 1160);
    TEST_DATETIME_DATE_1904(1999,  1,  1, 34699);
    TEST_DATETIME_DATE_1904(1999,  1, 31, 34729);
    TEST_DATETIME_DATE_1904(1999,  2,  1, 34730);
    TEST_DATETIME_DATE_1904(1999,  2, 28, 34757);
    TEST_DATETIME_DATE_1904(1999,  3,  1, 34758);
    TEST_DATETIME_DATE_1904(1999,  3, 31, 34788);
    TEST_DATETIME_DATE_1904(1999,  4,  1, 34789);
    TEST_DATETIME_DATE_1904(1999,  4, 30, 34818);
    TEST_DATETIME_DATE_1904(1999,  5,  1, 34819);
    TEST_DATETIME_DATE_1904(1999,  5, 31, 34849);
    TEST_DATETIME_DATE_1904(1999,  6,  1, 34850);
    TEST_DATETIME_DATE_1904(1999,  6, 30, 34879);
    TEST_DATETIME_DATE_1904(1999,  7,  1, 34880);
    TEST_DATETIME_DATE_1904(1999,  7, 31, 34910);
    TEST_DATETIME_DATE_1904(1999,  8,  1, 34911);
    TEST_DATETIME_DATE_1904(1999,  8, 31, 34941);
    TEST_DATETIME_DATE_1904(1999,  9,  1, 34942);
    TEST_DATETIME_DATE_1904(1999,  9, 30, 34971);
    TEST_DATETIME_DATE_1904(1999, 10,  1, 34972);
    TEST_DATETIME_DATE_1904(1999, 10, 31, 35002);
    TEST_DATETIME_DATE_1904(1999, 11,  1, 35003);
    TEST_DATETIME_DATE_1904(1999, 11, 30, 35032);
    TEST_DATETIME_DATE_1904(1999, 12,  1, 35033);
    TEST_DATETIME_DATE_1904(1999, 12, 31, 35063);
    TEST_DATETIME_DATE_1904(2000,  1,  1, 35064);
    TEST_DATETIME_DATE_1904(2000,  1, 31, 35094);
    TEST_DATETIME_DATE_1904(2000,  2,  1, 35095);
    TEST_DATETIME_DATE_1904(2000,  2, 29, 35123);
    TEST_DATETIME_DATE_1904(2000,  3,  1, 35124);
    TEST_DATETIME_DATE_1904(2000,  3, 31, 35154);
    TEST_DATETIME_DATE_1904(2000,  4,  1, 35155);
    TEST_DATETIME_DATE_1904(2000,  4, 30, 35184);
    TEST_DATETIME_DATE_1904(2000,  5,  1, 35185);
    TEST_DATETIME_DATE_1904(2000,  5, 31, 35215);
    TEST_DATETIME_DATE_1904(2000,  6,  1, 35216);
    TEST_DATETIME_DATE_1904(2000,  6, 30, 35245);
    TEST_DATETIME_DATE_1904(2000,  7,  1, 35246);
    TEST_DATETIME_DATE_1904(2000,  7, 31, 35276);
    TEST_DATETIME_DATE_1904(2000,  8,  1, 35277);
    TEST_DATETIME_DATE_1904(2000,  8, 31, 35307);
    TEST_DATETIME_DATE_1904(2000,  9,  1, 35308);
    TEST_DATETIME_DATE_1904(2000,  9, 30, 35337);
    TEST_DATETIME_DATE_1904(2000, 10,  1, 35338);
    TEST_DATETIME_DATE_1904(2000, 10, 31, 35368);
    TEST_DATETIME_DATE_1904(2000, 11,  1, 35369);
    TEST_DATETIME_DATE_1904(2000, 11, 30, 35398);
    TEST_DATETIME_DATE_1904(2000, 12,  1, 35399);
    TEST_DATETIME_DATE_1904(2000, 12, 31, 35429);
    TEST_DATETIME_DATE_1904(2001,  1,  1, 35430);
    TEST_DATETIME_DATE_1904(2001,  1, 31, 35460);
    TEST_DATETIME_DATE_1904(2001,  2,  1, 35461);
    TEST_DATETIME_DATE_1904(2001,  2, 28, 35488);
    TEST_DATETIME_DATE_1904(2001,  3,  1, 35489);
    TEST_DATETIME_DATE_1904(2001,  3, 31, 35519);
    TEST_DATETIME_DATE_1904(2001,  4,  1, 35520);
    TEST_DATETIME_DATE_1904(2001,  4, 30, 35549);
    TEST_DATETIME_DATE_1904(2001,  5,  1, 35550);
    TEST_DATETIME_DATE_1904(2001,  5, 31, 35580);
    TEST_DATETIME_DATE_1904(2001,  6,  1, 35581);
    TEST_DATETIME_DATE_1904(2001,  6, 30, 35610);
    TEST_DATETIME_DATE_1904(2001,  7,  1, 35611);
    TEST_DATETIME_DATE_1904(2001,  7, 31, 35641);
    TEST_DATETIME_DATE_1904(2001,  8,  1, 35642);
    TEST_DATETIME_DATE_1904(2001,  8, 31, 35672);
    TEST_DATETIME_DATE_1904(2001,  9,  1, 35673);
    TEST_DATETIME_DATE_1904(2001,  9, 30, 35702);
    TEST_DATETIME_DATE_1904(2001, 10,  1, 35703);
    TEST_DATETIME_DATE_1904(2001, 10, 31, 35733);
    TEST_DATETIME_DATE_1904(2001, 11,  1, 35734);
    TEST_DATETIME_DATE_1904(2001, 11, 30, 35763);
    TEST_DATETIME_DATE_1904(2001, 12,  1, 35764);
    TEST_DATETIME_DATE_1904(2001, 12, 31, 35794);
    TEST_DATETIME_DATE_1904(2400,  1,  1, 181161);
    TEST_DATETIME_DATE_1904(2400,  1, 31, 181191);
    TEST_DATETIME_DATE_1904(2400,  2,  1, 181192);
    TEST_DATETIME_DATE_1904(2400,  2, 29, 181220);
    TEST_DATETIME_DATE_1904(2400,  3,  1, 181221);
    TEST_DATETIME_DATE_1904(2400,  3, 31, 181251);
    TEST_DATETIME_DATE_1904(2400,  4,  1, 181252);
    TEST_DATETIME_DATE_1904(2400,  4, 30, 181281);
    TEST_DATETIME_DATE_1904(2400,  5,  1, 181282);
    TEST_DATETIME_DATE_1904(2400,  5, 31, 181312);
    TEST_DATETIME_DATE_1904(2400,  6,  1, 181313);
    TEST_DATETIME_DATE_1904(2400,  6, 30, 181342);
    TEST_DATETIME_DATE_1904(2400,  7,  1, 181343);
    TEST_DATETIME_DATE_1904(2400,  7, 31, 181373);
    TEST_DATETIME_DATE_1904(2400,  8,  1, 181374);
    TEST_DATETIME_DATE_1904(2400,  8, 31, 181404);
    TEST_DATETIME_DATE_1904(2400,  9,  1, 181405);
    TEST_DATETIME_DATE_1904(2400,  9, 30, 181434);
    TEST_DATETIME_DATE_1904(2400, 10,  1, 181435);
    TEST_DATETIME_DATE_1904(2400, 10, 31, 181465);
    TEST_DATETIME_DATE_1904(2400, 11,  1, 181466);
    TEST_DATETIME_DATE_1904(2400, 11, 30, 181495);
    TEST_DATETIME_DATE_1904(2400, 12,  1, 181496);
    TEST_DATETIME_DATE_1904(2400, 12, 31, 181526);
    TEST_DATETIME_DATE_1904(4000,  1,  1, 765549);
    TEST_DATETIME_DATE_1904(4000,  1, 31, 765579);
    TEST_DATETIME_DATE_1904(4000,  2,  1, 765580);
    TEST_DATETIME_DATE_1904(4000,  2, 29, 765608);
    TEST_DATETIME_DATE_1904(4000,  3,  1, 765609);
    TEST_DATETIME_DATE_1904(4000,  3, 31, 765639);
    TEST_DATETIME_DATE_1904(4000,  4,  1, 765640);
    TEST_DATETIME_DATE_1904(4000,  4, 30, 765669);
    TEST_DATETIME_DATE_1904(4000,  5,  1, 765670);
    TEST_DATETIME_DATE_1904(4000,  5, 31, 765700);
    TEST_DATETIME_DATE_1904(4000,  6,  1, 765701);
    TEST_DATETIME_DATE_1904(4000,  6, 30, 765730);
    TEST_DATETIME_DATE_1904(4000,  7,  1, 765731);
    TEST_DATETIME_DATE_1904(4000,  7, 31, 765761);
    TEST_DATETIME_DATE_1904(4000,  8,  1, 765762);
    TEST_DATETIME_DATE_1904(4000,  8, 31, 765792);
    TEST_DATETIME_DATE_1904(4000,  9,  1, 765793);
    TEST_DATETIME_DATE_1904(4000,  9, 30, 765822);
    TEST_DATETIME_DATE_1904(4000, 10,  1, 765823);
    TEST_DATETIME_DATE_1904(4000, 10, 31, 765853);
    TEST_DATETIME_DATE_1904(4000, 11,  1, 765854);
    TEST_DATETIME_DATE_1904(4000, 11, 30, 765883);
    TEST_DATETIME_DATE_1904(4000, 12,  1, 765884);
    TEST_DATETIME_DATE_1904(4000, 12, 31, 765914);
    TEST_DATETIME_DATE_1904(4321,  1,  1, 882792);
    TEST_DATETIME_DATE_1904(4321,  1, 31, 882822);
    TEST_DATETIME_DATE_1904(4321,  2,  1, 882823);
    TEST_DATETIME_DATE_1904(4321,  2, 28, 882850);
    TEST_DATETIME_DATE_1904(4321,  3,  1, 882851);
    TEST_DATETIME_DATE_1904(4321,  3, 31, 882881);
    TEST_DATETIME_DATE_1904(4321,  4,  1, 882882);
    TEST_DATETIME_DATE_1904(4321,  4, 30, 882911);
    TEST_DATETIME_DATE_1904(4321,  5,  1, 882912);
    TEST_DATETIME_DATE_1904(4321,  5, 31, 882942);
    TEST_DATETIME_DATE_1904(4321,  6,  1, 882943);
    TEST_DATETIME_DATE_1904(4321,  6, 30, 882972);
    TEST_DATETIME_DATE_1904(4321,  7,  1, 882973);
    TEST_DATETIME_DATE_1904(4321,  7, 31, 883003);
    TEST_DATETIME_DATE_1904(4321,  8,  1, 883004);
    TEST_DATETIME_DATE_1904(4321,  8, 31, 883034);
    TEST_DATETIME_DATE_1904(4321,  9,  1, 883035);
    TEST_DATETIME_DATE_1904(4321,  9, 30, 883064);
    TEST_DATETIME_DATE_1904(4321, 10,  1, 883065);
    TEST_DATETIME_DATE_1904(4321, 10, 31, 883095);
    TEST_DATETIME_DATE_1904(4321, 11,  1, 883096);
    TEST_DATETIME_DATE_1904(4321, 11, 30, 883125);
    TEST_DATETIME_DATE_1904(4321, 12,  1, 883126);
    TEST_DATETIME_DATE_1904(4321, 12, 31, 883156);
    TEST_DATETIME_DATE_1904(9999,  1,  1, 2956639);
    TEST_DATETIME_DATE_1904(9999,  1, 31, 2956669);
    TEST_DATETIME_DATE_1904(9999,  2,  1, 2956670);
    TEST_DATETIME_DATE_1904(9999,  2, 28, 2956697);
    TEST_DATETIME_DATE_1904(9999,  3,  1, 2956698);
    TEST_DATETIME_DATE_1904(9999,  3, 31, 2956728);
    TEST_DATETIME_DATE_1904(9999,  4,  1, 2956729);
    TEST_DATETIME_DATE_1904(9999,  4, 30, 2956758);
    TEST_DATETIME_DATE_1904(9999,  5,  1, 2956759);
    TEST_DATETIME_DATE_1904(9999,  5, 31, 2956789);
    TEST_DATETIME_DATE_1904(9999,  6,  1, 2956790);
    TEST_DATETIME_DATE_1904(9999,  6, 30, 2956819);
    TEST_DATETIME_DATE_1904(9999,  7,  1, 2956820);
    TEST_DATETIME_DATE_1904(9999,  7, 31, 2956850);
    TEST_DATETIME_DATE_1904(9999,  8,  1, 2956851);
    TEST_DATETIME_DATE_1904(9999,  8, 31, 2956881);
    TEST_DATETIME_DATE_1904(9999,  9,  1, 2956882);
    TEST_DATETIME_DATE_1904(9999,  9, 30, 2956911);
    TEST_DATETIME_DATE_1904(9999, 10,  1, 2956912);
    TEST_DATETIME_DATE_1904(9999, 10, 31, 2956942);
    TEST_DATETIME_DATE_1904(9999, 11,  1, 2956943);
    TEST_DATETIME_DATE_1904(9999, 11, 30, 2956972);
    TEST_DATETIME_DATE_1904(9999, 12,  1, 2956973);
    TEST_DATETIME_DATE_1904(9999, 12, 31, 2957003);
}

CTEST(utility, _datetime_time_only) {

    double got;
    lxw_datetime *datetime;

    TEST_DATETIME_TIME( 0,  0,  0.000, 0);
    TEST_DATETIME_TIME( 0, 15, 20.213, 1.0650613425925924E-2);
    TEST_DATETIME_TIME( 0, 16, 48.290, 1.1670023148148148E-2);
    TEST_DATETIME_TIME( 0, 55, 25.446, 3.8488958333333337E-2);
    TEST_DATETIME_TIME( 1,  2, 46.891, 4.3598275462962965E-2);
    TEST_DATETIME_TIME( 1,  4, 15.597, 4.4624965277777782E-2);
    TEST_DATETIME_TIME( 1,  9, 40.889, 4.8389918981481483E-2);
    TEST_DATETIME_TIME( 1, 11, 32.560, 4.9682407407407404E-2);
    TEST_DATETIME_TIME( 1, 30, 19.169, 6.2721863425925936E-2);
    TEST_DATETIME_TIME( 1, 48, 25.580, 7.5296064814814809E-2);
    TEST_DATETIME_TIME( 2,  3, 31.919, 8.5786099537037031E-2);
    TEST_DATETIME_TIME( 2, 11, 11.986, 9.1110949074074077E-2);
    TEST_DATETIME_TIME( 2, 24, 37.095, 0.10042934027777778);
    TEST_DATETIME_TIME( 2, 35,  7.220, 0.1077224537037037);
    TEST_DATETIME_TIME( 2, 45, 12.109, 0.11472348379629631);
    TEST_DATETIME_TIME( 3,  6, 39.990, 0.12962951388888888);
    TEST_DATETIME_TIME( 3,  8,  8.251, 0.13065105324074075);
    TEST_DATETIME_TIME( 3, 19, 12.576, 0.13833999999999999);
    TEST_DATETIME_TIME( 3, 29, 42.574, 0.14563164351851851);
    TEST_DATETIME_TIME( 3, 37, 30.813, 0.1510510763888889);
    TEST_DATETIME_TIME( 4, 14, 38.231, 0.1768313773148148);
    TEST_DATETIME_TIME( 4, 16, 28.559, 0.17810832175925925);
    TEST_DATETIME_TIME( 4, 17, 58.222, 0.17914608796296297);
    TEST_DATETIME_TIME( 4, 21, 41.794, 0.18173372685185185);
    TEST_DATETIME_TIME( 4, 56, 35.792, 0.2059698148148148);
    TEST_DATETIME_TIME( 5, 25, 14.885, 0.22586672453703704);
    TEST_DATETIME_TIME( 5, 26,  5.724, 0.22645513888888891);
    TEST_DATETIME_TIME( 5, 46, 44.068, 0.24078782407407406);
    TEST_DATETIME_TIME( 5, 48,  1.141, 0.2416798726851852);
    TEST_DATETIME_TIME( 5, 53, 52.315, 0.24574438657407408);
    TEST_DATETIME_TIME( 6, 14, 48.580, 0.26028449074074073);
    TEST_DATETIME_TIME( 6, 46, 15.738, 0.28212659722222222);
    TEST_DATETIME_TIME( 7, 31, 20.407, 0.31343063657407405);
    TEST_DATETIME_TIME( 7, 58, 33.754, 0.33233511574074076);
    TEST_DATETIME_TIME( 8,  7, 43.130, 0.33869363425925925);
    TEST_DATETIME_TIME( 8, 29, 11.091, 0.35360059027777774);
    TEST_DATETIME_TIME( 9,  8, 15.328, 0.380732962962963);
    TEST_DATETIME_TIME( 9, 30, 41.781, 0.39631690972222228);
    TEST_DATETIME_TIME( 9, 34,  4.462, 0.39866275462962958);
    TEST_DATETIME_TIME( 9, 37, 23.945, 0.40097158564814817);
    TEST_DATETIME_TIME( 9, 37, 56.655, 0.40135017361111114);
    TEST_DATETIME_TIME( 9, 45, 12.230, 0.40639155092592594);
    TEST_DATETIME_TIME( 9, 54, 14.782, 0.41267108796296298);
    TEST_DATETIME_TIME( 9, 54, 22.108, 0.41275587962962962);
    TEST_DATETIME_TIME(10,  1, 36.151, 0.41777952546296299);
    TEST_DATETIME_TIME(12,  9, 48.602, 0.50681252314814818);
    TEST_DATETIME_TIME(12, 34,  8.549, 0.52371005787037039);
    TEST_DATETIME_TIME(12, 56,  6.495, 0.53896406249999995);
    TEST_DATETIME_TIME(12, 58, 58.217, 0.54095158564814816);
    TEST_DATETIME_TIME(12, 59, 54.263, 0.54160026620370372);
    TEST_DATETIME_TIME(13, 34, 41.331, 0.56575614583333333);
    TEST_DATETIME_TIME(13, 58, 28.601, 0.58227547453703699);
    TEST_DATETIME_TIME(14,  2, 16.899, 0.58491781249999997);
    TEST_DATETIME_TIME(14, 36, 17.444, 0.60853523148148148);
    TEST_DATETIME_TIME(14, 37, 57.451, 0.60969271990740748);
    TEST_DATETIME_TIME(14, 57, 42.757, 0.6234115393518519);
    TEST_DATETIME_TIME(15, 10, 48.307, 0.6325035532407407);
    TEST_DATETIME_TIME(15, 14, 39.890, 0.63518391203703706);
    TEST_DATETIME_TIME(15, 19, 47.988, 0.63874986111111109);
    TEST_DATETIME_TIME(16,  4, 24.344, 0.66972620370370362);
    TEST_DATETIME_TIME(16, 22, 23.952, 0.68222166666666662);
    TEST_DATETIME_TIME(16, 29, 55.999, 0.6874536921296297);
    TEST_DATETIME_TIME(16, 58, 20.259, 0.70717892361111112);
    TEST_DATETIME_TIME(17,  4,  2.415, 0.71113906250000003);
    TEST_DATETIME_TIME(17, 18, 29.630, 0.72117627314814825);
    TEST_DATETIME_TIME(17, 47, 21.323, 0.74121901620370367);
    TEST_DATETIME_TIME(17, 53, 29.866, 0.74548456018518516);
    TEST_DATETIME_TIME(17, 53, 41.076, 0.74561430555555563);
    TEST_DATETIME_TIME(17, 55,  6.044, 0.74659773148148145);
    TEST_DATETIME_TIME(18, 14, 49.151, 0.760291099537037);
    TEST_DATETIME_TIME(18, 17, 45.738, 0.76233493055555546);
    TEST_DATETIME_TIME(18, 29, 59.700, 0.77082986111111118);
    TEST_DATETIME_TIME(18, 33, 21.233, 0.77316241898148153);
    TEST_DATETIME_TIME(19, 14, 24.673, 0.80167445601851861);
    TEST_DATETIME_TIME(19, 17, 12.816, 0.80362055555555545);
    TEST_DATETIME_TIME(19, 23, 36.418, 0.80806039351851855);
    TEST_DATETIME_TIME(19, 46, 25.908, 0.82391097222222232);
    TEST_DATETIME_TIME(20,  7, 47.314, 0.83874206018518516);
    TEST_DATETIME_TIME(20, 31, 37.603, 0.85529633101851854);
    TEST_DATETIME_TIME(20, 39, 57.770, 0.86108530092592594);
    TEST_DATETIME_TIME(20, 50, 17.067, 0.86825309027777775);
    TEST_DATETIME_TIME(21,  2, 57.827, 0.87705818287037041);
    TEST_DATETIME_TIME(21, 23,  5.519, 0.891036099537037);
    TEST_DATETIME_TIME(21, 34, 49.572, 0.89918486111111118);
    TEST_DATETIME_TIME(21, 39,  5.944, 0.90215212962962965);
    TEST_DATETIME_TIME(21, 39, 18.426, 0.90229659722222222);
    TEST_DATETIME_TIME(21, 46,  7.769, 0.90703436342592603);
    TEST_DATETIME_TIME(21, 57, 55.662, 0.91522756944444439);
    TEST_DATETIME_TIME(22, 19, 11.732, 0.92999689814814823);
    TEST_DATETIME_TIME(22, 23, 51.376, 0.93323351851851843);
    TEST_DATETIME_TIME(22, 27, 58.771, 0.93609688657407408);
    TEST_DATETIME_TIME(22, 43, 30.392, 0.94687953703703709);
    TEST_DATETIME_TIME(22, 48, 25.834, 0.95029900462962968);
    TEST_DATETIME_TIME(22, 53, 51.727, 0.95407091435185187);
    TEST_DATETIME_TIME(23, 12, 56.536, 0.96732101851851848);
    TEST_DATETIME_TIME(23, 15, 54.109, 0.96937626157407408);
    TEST_DATETIME_TIME(23, 17, 12.632, 0.97028509259259266);
    TEST_DATETIME_TIME(23, 59, 59.999, 0.99999998842592586);
}

*/