使用AM / PM将string.format和timespan转换为12小时格式

时间:2013-10-25 16:21:37

标签: c# asp.net-mvc-4 timespan

我有以下代码,当前给出了一个时间跨度列表,其中包含一小时/分钟(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();
        }

2 个答案:

答案 0 :(得分:6)

    [Test]
    public void TimeSpan_PmAmFormat()
    {
        TimeSpan timeSpan = new TimeSpan(23, 20, 0);
        DateTime dateTime = DateTime.MinValue.Add(timeSpan);

        CultureInfo cultureInfo = CultureInfo.InvariantCulture;

        // optional
        //CultureInfo cultureInfo = new CultureInfo(CultureInfo.CurrentCulture.Name);
        //cultureInfo.DateTimeFormat.PMDesignator = "PM";

        string result = dateTime.ToString("hh:mm tt", cultureInfo);

        Assert.True(result.StartsWith("11:20 PM"));
    }

答案 1 :(得分:3)

您似乎可以更改代码,以便轻松返回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")