2013-10-25 58 views
0

我有以下代碼,當前給出了一小時/分鐘(24小時格式)的時間表列表。我需要更改string.format以顯示小時/分鐘上午或下午(12小時格式)。使用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(); 
     } 
+0

但是關於是否將時間超過24個呢? –

+0

這是可能的一個時間跨度? – devfunkd

+1

當然可以。試試這個'TimeSpan.FromHours(100);'。 –

回答

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)); 

那麼您可以在DateTime對象調用ToString().ToString("hh:mm tt")

+0

好吧我得到的方法改變了,除了改變Distinct()調用(不知道如何)。 – devfunkd

+0

@deliriousDev - 我編輯了我的答案。我沒有測試代碼,但是,這個想法就在那裏:建立'TimeSpan'的獨特列表,然後從中建立'DateTime'的列表。 –

5
[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")); 
    } 
相關問題