2011-12-06 30 views
16

Tôi đang thiết lập này trong C# với dòng này:HTTP, định dạng cho "Hết hạn"

WebOperationContext.Current.OutgoingResponse.Headers.Add(HttpResponseHeader.Expires, DateTime.Now.AddSeconds(10).ToString()); 

Bây giờ tôi biết định dạng là tắt về vấn đề này như dự kiến ​​sau: Thứ Ba, 06 Tháng 12 2011 20 : 24: 15 GMT

Có lớp học nào trong .NET đang thực hiện IFormatProvider Tôi có thể tận dụng ở đây không? Hoặc tôi sẽ cần phải tạo của riêng tôi?

Trả lời

13

Bạn có thể sử dụng Custom Date and Time Format Strings.

Tue, 06 tháng 12 năm 2011 20:24:15 GMT

tạo ra các định dạng trên như sau:

DateTime.Now.AddDays(30).ToUniversalTime() 
    .ToString("ddd, dd MMM yyyy HH:mm:ss 'GMT'"); 
+10

Hãy coi chừng, mã này không phải là văn hóa không nhạy cảm và sẽ định dạng ngày bằng cách sử dụng ngôn ngữ máy chủ. Bạn nên sử dụng 'thedate.ToString (" R ")' hoặc 'thedate.ToString (" ddd, dd MMM yyyy HH: mm: ss 'GMT' ", DateTimeFormatInfo.InvariantInfo)' –

+0

Tất nhiên, bạn vẫn phải gọi '.ToUniversalTime()'. –

+0

Theo đề xuất của Steve B và trong câu trả lời của Jonno [http://stackoverflow.com/a/17079611/361762), định dạng chuỗi "R" là cách tốt nhất để làm điều này. ví dụ. 'DateTime.UtcNow.AddDays (30) .ToString (" R ")' – dave

-7

tôi đã kết thúc tạo này:

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Web; 

namespace WcfService1 
{ 
    public static class HttpExpiresFormat 
    { 

     private enum Month 
     { 
      Jan = 1, Feb = 2, Mar = 3, Apr = 4, May = 5, Jun = 6, Jul = 7, Aug = 8, Sept = 9, Oct = 10, Nov = 11, Dec = 12 
     } 


     public static string HttpExpireDate(double secondsToAdd) 
     { 
      DateTime dateTime = DateTime.Now; 

      string dayOfWeek = ConvertDayToSmall(dateTime.DayOfWeek.ToString()); 
      string day = dateTime.Day < 10 ? "0" + dateTime.Day.ToString() : dateTime.Day.ToString(); 
      string month = ((Month)dateTime.Month).ToString(); 
      string year = dateTime.Year.ToString(); 
      char[] trim = new char[] { '.' }; 
      string substring = dateTime.AddHours(5).AddSeconds(secondsToAdd).TimeOfDay.ToString(); 
      string time = substring.Remove(substring.LastIndexOf('.')) + " GMT"; 

      return string.Format("{0}, {1} {2} {3} {4}", dayOfWeek, day, month, year, time); 
     } 

     private static string ConvertDayToSmall(string day) 
     { 
      switch (day) 
      { 
       case "Monday": 
        return "Mon"; 
       case "Tuesday": 
        return "Tue"; 
       case "Wednesday": 
        return "Wed"; 
       case "Thursday": 
        return "Thu"; 
       case "Friday": 
        return "Fri"; 
       default: 
        return null; 
      } 
     } 
    } 
} 
26

tôi sử dụng DateTime.UtcNow.AddDays(30).ToString("R")

Từ MSDN:

Chỉ định định dạng chuẩn "R" hoặc "r" đại diện cho chuỗi định dạng ngày và giờ tùy chỉnh được xác định bởi thuộc tính DateTimeFormatInfo.RFC1123Pattern. Mẫu này phản ánh một tiêu chuẩn được xác định và thuộc tính là chỉ đọc. Do đó, nó luôn luôn giống nhau, bất kể văn hóa được sử dụng hoặc nhà cung cấp định dạng được cung cấp. Chuỗi định dạng tùy chỉnh là "ddd, dd MMM yyyy HH ':' mm ':' ss 'GMT'". Khi sử dụng công cụ chỉ định định dạng chuẩn này, thao tác định dạng hoặc phân tích cú pháp luôn sử dụng văn bản bất biến

+0

Đây là * chắc chắn * đúng cách để làm điều đó! – mortb

+0

Đây phải là câu trả lời được chấp nhận. – Art

1

Bạn không cần phải vượt qua chuỗi và đặt Tiêu đề. Tất cả những gì bạn cần, là đặt thuộc tính LastModified:

WebOperationContext.Current.OutgoingResponse.LastModified = DateTime.Now; // DataTime.UtcNow; 

Bạn thậm chí không cần phải lo lắng về việc vượt qua thời gian UTC, nó xử lý nó cho bạn.

Các vấn đề liên quan