@@ -441,72 +441,6 @@ pub fn Time(precision_: comptime_int, comptime has_offset: bool) type {
441441 pub fn add (self : Self , hour : i64 , minute : i64 , second : i64 , subsecond : i64 ) Self {
442442 return self .addWithOverflow (hour , minute , second , subsecond ).time ;
443443 }
444-
445- pub fn fromRfc3339 (str : []const u8 ) ! Self {
446- if (str .len < "hh:mm:ssZ" .len ) return error .Parsing ;
447-
448- if (str [2 ] != ':' or str [5 ] != ':' ) return error .Parsing ;
449-
450- const hour = try std .fmt .parseInt (Hour , str [0.. 2], 10 );
451- const minute = try std .fmt .parseInt (Minute , str [3.. 5], 10 );
452- const second = try std .fmt .parseInt (Second , str [6.. 8], 10 );
453-
454- var i : usize = 8 ;
455- const subsecond : Subsecond = if (str [i ] == '.' ) brk : {
456- i += 1 ;
457- while (i < str .len and std .ascii .isDigit (str [i ])) : (i += 1 ) {}
458- if (Subsecond == u0 ) break :brk 0 ;
459- const subsecond_str = str [9.. i ];
460- // Choose largest performant type.
461- // Ideally, this would allow infinite precision.
462- const T = f64 ;
463- var subsecond = try std .fmt .parseFloat (T , subsecond_str );
464- const actual_precision : T = @floatFromInt (subsecond_str .len );
465- subsecond *= std .math .pow (T , 10 , precision - actual_precision );
466-
467- break :brk @intFromFloat (subsecond );
468- } else 0 ;
469-
470- // timezone required
471- if (str .len <= i ) return error .Parsing ;
472-
473- const offset = if (std .ascii .toUpper (str [i ]) == 'Z' ) 0 else brk : {
474- var sign : IMinutes = 1 ;
475- if (str [i ] == '-' ) {
476- sign = -1 ;
477- i += 1 ;
478- } else if (str [i ] == '+' ) {
479- i += 1 ;
480- }
481-
482- const offset_hour = try std .fmt .parseInt (IMinutes , str [i .. ][0.. 2], 10 );
483- if (str [i + 2 ] != ':' ) return error .Parsing ;
484- const offset_minute = try std .fmt .parseInt (IMinutes , str [i + 3 .. ][0.. 2], 10 );
485-
486- break :brk sign * (offset_hour * 60 + offset_minute );
487- };
488-
489- return .{ .hour = hour , .minute = minute , .second = second , .subsecond = subsecond , .offset = offset };
490- }
491-
492- pub fn toRfc3339 (self : Self , writer : anytype ) ! void {
493- if (self .hour > 24 or self .minute > 59 or self .second > 60 ) return error .Range ;
494- try writer .print ("{d:0>2}:{d:0>2}:{d:0>2}" , .{ self .hour , self .minute , self .second });
495- if (self .subsecond != 0 ) {
496- // We could trim trailing zeros here to save space.
497- try writer .print (".{d}" , .{self .subsecond });
498- }
499- if (self .offset == 0 ) {
500- try writer .writeByte ('Z' );
501- } else {
502- try writer .writeByte (if (self .offset > 0 ) '+' else '-' );
503- const abs : u16 = @intCast (if (self .offset > 0 ) self .offset else - self .offset );
504- const offset_hour = abs / 60 ;
505- if (offset_hour < -24 or offset_hour > 24 ) return error .Range ;
506- const offset_minute = abs % 60 ;
507- try writer .print ("{d:0>2}:{d:0>2}" , .{ offset_hour , offset_minute });
508- }
509- }
510444 };
511445}
512446
@@ -530,26 +464,6 @@ test Time {
530464 TimeMilliOffset { .hour = 22 , .minute = 30 , .offset = -90 },
531465 TimeMilliOffset .fromDaySeconds (0 , .{ .offset = -90 }),
532466 );
533-
534- try expectEqual (TimeMilliOffset { .hour = 22 , .minute = 30 , .offset = -90 }, try TimeMilliOffset .fromRfc3339 ("22:30:00-01:30" ));
535- try expectEqual (TimeMilliOffset { .hour = 22 , .minute = 30 , .offset = 90 }, try TimeMilliOffset .fromRfc3339 ("22:30:00.0000+01:30" ));
536- try expectEqual (TimeMilliOffset { .hour = 22 , .minute = 30 , .second = 20 , .subsecond = 100 }, try TimeMilliOffset .fromRfc3339 ("22:30:20.1Z" ));
537-
538- const expectError = std .testing .expectError ;
539- try expectError (error .Parsing , TimeMilliOffset .fromRfc3339 ("22:30:20.100" )); // missing timezone
540- try expectError (error .InvalidCharacter , TimeMilliOffset .fromRfc3339 ("22:30:20.1a00" ));
541- try expectError (error .Parsing , TimeMilliOffset .fromRfc3339 ("2:00:20Z" )); // missing hour digit
542-
543- var buf : [32 ]u8 = undefined ;
544- var stream = std .io .fixedBufferStream (& buf );
545- const time = TimeMilliOffset { .hour = 22 , .minute = 30 , .second = 20 , .subsecond = 100 };
546- try time .toRfc3339 (stream .writer ());
547- try std .testing .expectEqualStrings ("22:30:20.100Z" , stream .getWritten ());
548-
549- stream .reset ();
550- const time2 = TimeMilliOffset { .hour = 22 , .minute = 30 , .second = 20 , .subsecond = 100 , .offset = 100 };
551- try time2 .toRfc3339 (stream .writer ());
552- try std .testing .expectEqualStrings ("22:30:20.100+01:40" , stream .getWritten ());
553467}
554468
555469comptime {
0 commit comments