Преобразование string.format и временного интервала в 12-часовой формат с AM/PM

У меня есть следующий код, который в настоящее время дает мне список временных интервалов с час/минута (24-часовой формат). Мне нужно изменить string.format, чтобы показать часы/минуты AM или PM (12-часовой формат).

var availableTimes =
                _appointmentService.GetAvailableHours(date, appointmentId)
                    .Select(x => string.Format("{0:D2}:{1:D2}", x.Hours, x.Minutes));

Как лучше всего это сделать? Я не вижу в любом случае с промежутком времени.

* Вот метод GetAvailableHours, который он использует.

public IEnumerable<TimeSpan> GetAvailableHours(DateTime? date, int? appointmentId)
        {
            if (date == null) return null;
            var hours = new List<DateTime>();
            for (var ts = new TimeSpan(); ts <= new TimeSpan(23, 30, 0); ts = ts.Add(new TimeSpan(0, 30, 0)))
            {
                hours.Add(date.Value + ts);
            }

            var booked = _appointmentRepository.Get
                .Where(x =>
                    (!appointmentId.HasValue || x.Id != appointmentId))
                .Select(x => x.ScheduledTime).ToList();
            //return available hours from shifts
            var workingHours = from h in hours
                               from s in
                                   _scheduleRepository.Get.Where(
                                       x => x.ShiftStart <= h && x.ShiftEnd >= EntityFunctions.AddHours(h, 1))
                               where
                                   s.ShiftStart <= h && s.ShiftEnd >= h.AddHours(-1) &&
                                   booked.Count(x => x == h) == 0

                               select h.TimeOfDay;



            //match available hours with another appointment 
            return workingHours.Distinct();
        }

person devfunkd    schedule 25.10.2013    source источник
comment
Но что, если количество часов превысит 24?   -  person Hamlet Hakobyan    schedule 25.10.2013
comment
Возможно ли это с временным интервалом?   -  person devfunkd    schedule 25.10.2013
comment
Да, конечно. Попробуйте это TimeSpan.FromHours(100);.   -  person Hamlet Hakobyan    schedule 25.10.2013
comment
Для TimeSpan на самом деле не имеет смысла связывать с ним AM или PM. Возможно, имеет смысл переключиться на DateTime из объекта TimeSpan.   -  person Justin Helgerson    schedule 25.10.2013
comment
Предполагается, что метод возвращает количество часов, доступных в тот день, когда между началом и концом смен, доступных в этот день, нет встреч. Так что, может быть, временной интервал — не лучшая вещь для использования здесь?   -  person devfunkd    schedule 25.10.2013
comment
@Ek0nomik, как лучше всего это сделать? Я согласен, что дата и время было бы лучше.   -  person devfunkd    schedule 25.10.2013
comment
@deliriousDev - я добавил ответ, который может помочь.   -  person Justin Helgerson    schedule 25.10.2013


Ответы (1)


Похоже, вы можете легко изменить свой код, чтобы он возвращал IEnumerable<DateTime>.

//Get your distinct time spans
var distinctTimeSpans = workingHours.Distinct();
//Build date objects from the parameter and time span objects
var dates = distinctTimeSpans.Select(ts => new DateTime(date.Value.Year, date.Value.Month, date.Value.Day, ts.Hours, ts.Minutes, ts.Seconds));

Затем вы можете вызвать ToString() для вашего объекта DateTime: .ToString("hh:mm tt")

person Justin Helgerson    schedule 25.10.2013
comment
Хорошо, я изменил метод, за исключением изменения вызова Distinct() (не знаю, как). - person devfunkd; 25.10.2013
comment
@deliriousDev - я отредактировал свой ответ. Я не тестировал код, но идея есть: создайте отдельный список TimeSpan, а затем создайте из него список DateTime. - person Justin Helgerson; 25.10.2013