Skip to content

Commit c1fd9b9

Browse files
authored
Merge pull request #32 from open-watt/fix_datetime_tostring
Fix the DateTime stringify function.
2 parents bcaaa13 + 0cf0f6b commit c1fd9b9

File tree

1 file changed

+35
-25
lines changed

1 file changed

+35
-25
lines changed

src/urt/time.d

Lines changed: 35 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -394,55 +394,65 @@ pure nothrow @nogc:
394394
import urt.string.format : FormatArg;
395395
ptrdiff_t toString(char[] buffer, const(char)[] format, const(FormatArg)[] formatArgs) const
396396
{
397-
import urt.conv : format_int;
397+
import urt.conv : format_int, format_uint;
398+
399+
ptrdiff_t len;
400+
if (!buffer.ptr)
401+
{
402+
len = 15; // all the fixed chars
403+
len += year.format_int(null);
404+
if (ns)
405+
{
406+
++len; // the dot
407+
uint nsecs = ns;
408+
uint m = 0;
409+
while (nsecs)
410+
{
411+
++len;
412+
uint digit = nsecs / digit_multipliers[m];
413+
nsecs -= digit * digit_multipliers[m++];
414+
}
415+
}
416+
return len;
417+
}
398418

399419
size_t offset = 0;
400-
ptrdiff_t len = year.format_int(buffer[offset..$]);
420+
len = year.format_int(buffer[offset..$]);
401421
if (len < 0 || len == buffer.length)
402422
return -1;
403423
offset += len;
404424
buffer[offset++] = '-';
405-
len = month.format_int(buffer[offset..$]);
406-
if (len < 0 || len == buffer.length)
407-
return -1;
408-
offset += len;
425+
buffer[offset++] = '0' + (month / 10);
426+
buffer[offset++] = '0' + (month % 10);
409427
buffer[offset++] = '-';
410-
len = day.format_int(buffer[offset..$]);
411-
if (len < 0 || len == buffer.length)
412-
return -1;
413-
offset += len;
428+
buffer[offset++] = '0' + (day / 10);
429+
buffer[offset++] = '0' + (day % 10);
414430
buffer[offset++] = 'T';
415-
len = hour.format_int(buffer[offset..$], 10, 2, '0');
416-
if (len < 0 || len == buffer.length)
417-
return -1;
418-
offset += len;
431+
buffer[offset++] = '0' + (hour / 10);
432+
buffer[offset++] = '0' + (hour % 10);
419433
buffer[offset++] = ':';
420-
len = minute.format_int(buffer[offset..$], 10, 2, '0');
421-
if (len < 0 || len == buffer.length)
422-
return -1;
423-
offset += len;
434+
buffer[offset++] = '0' + (minute / 10);
435+
buffer[offset++] = '0' + (minute % 10);
424436
buffer[offset++] = ':';
425-
len = second.format_int(buffer[offset..$], 10, 2, '0');
426-
if (len < 0)
427-
return -1;
428-
offset += len;
437+
buffer[offset++] = '0' + (second / 10);
438+
buffer[offset++] = '0' + (second % 10);
429439
if (ns)
430440
{
431-
if (len == buffer.length)
441+
if (offset == buffer.length)
432442
return -1;
433443
buffer[offset++] = '.';
434444
uint nsecs = ns;
435445
uint m = 0;
436446
while (nsecs)
437447
{
438-
if (len == buffer.length)
448+
if (offset == buffer.length)
439449
return -1;
440450
int digit = nsecs / digit_multipliers[m];
441451
buffer[offset++] = cast(char)('0' + digit);
442452
nsecs -= digit * digit_multipliers[m++];
443453
}
444454
}
445-
return offset + len;
455+
return offset;
446456
}
447457

448458
ptrdiff_t fromString(const(char)[] s)

0 commit comments

Comments
 (0)