aboutsummaryrefslogtreecommitdiff
path: root/src/Costasdev.Busurbano.Backend/Types
diff options
context:
space:
mode:
Diffstat (limited to 'src/Costasdev.Busurbano.Backend/Types')
-rw-r--r--src/Costasdev.Busurbano.Backend/Types/VigoSchedules.cs56
1 files changed, 44 insertions, 12 deletions
diff --git a/src/Costasdev.Busurbano.Backend/Types/VigoSchedules.cs b/src/Costasdev.Busurbano.Backend/Types/VigoSchedules.cs
index 76c8fa1..f3a6727 100644
--- a/src/Costasdev.Busurbano.Backend/Types/VigoSchedules.cs
+++ b/src/Costasdev.Busurbano.Backend/Types/VigoSchedules.cs
@@ -20,27 +20,59 @@ public class ScheduledStop
[JsonPropertyName("starting_time")] public required string StartingTime { get; set; }
public DateTime? StartingDateTime()
{
- if (!TimeOnly.TryParse(StartingTime, out var time))
- {
- return null;
- }
- var dt = DateTime.Today + time.ToTimeSpan();
- return dt.AddSeconds(60 - dt.Second);
+ return ParseGtfsTime(StartingTime);
}
[JsonPropertyName("calling_ssm")] public required int CallingSsm { get; set; }
[JsonPropertyName("calling_time")] public required string CallingTime { get; set; }
public DateTime? CallingDateTime()
{
- if (!TimeOnly.TryParse(CallingTime, out var time))
- {
- return null;
- }
- var dt = DateTime.Today + time.ToTimeSpan();
- return dt.AddSeconds(60 - dt.Second);
+ return ParseGtfsTime(CallingTime);
}
[JsonPropertyName("terminus_code")] public required string TerminusCode { get; set; }
[JsonPropertyName("terminus_name")] public required string TerminusName { get; set; }
[JsonPropertyName("terminus_time")] public required string TerminusTime { get; set; }
+
+ /// <summary>
+ /// Parse GTFS time format (HH:MM:SS) which can have hours >= 24 for services past midnight
+ /// </summary>
+ private static DateTime? ParseGtfsTime(string timeStr)
+ {
+ if (string.IsNullOrWhiteSpace(timeStr))
+ {
+ return null;
+ }
+
+ var parts = timeStr.Split(':');
+ if (parts.Length != 3)
+ {
+ return null;
+ }
+
+ if (!int.TryParse(parts[0], out var hours) ||
+ !int.TryParse(parts[1], out var minutes) ||
+ !int.TryParse(parts[2], out var seconds))
+ {
+ return null;
+ }
+
+ // Handle GTFS times that exceed 24 hours (e.g., 25:30:00 for 1:30 AM next day)
+ var days = hours / 24;
+ var normalizedHours = hours % 24;
+
+ try
+ {
+ var dt = DateTime.Today
+ .AddDays(days)
+ .AddHours(normalizedHours)
+ .AddMinutes(minutes)
+ .AddSeconds(seconds);
+ return dt.AddSeconds(60 - dt.Second);
+ }
+ catch
+ {
+ return null;
+ }
+ }
}