2011-12-06 10 views
16

estoy fijando esto en C# con esta línea:HTTP, el formato de "caduca"

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

Ahora sé que el formato está apagado en esto, ya que espera el siguiente: mar, 06 de Dic 2011 20 : 24: 15 GMT

¿Existe alguna clase en .NET que implemente IFormatProvider que pueda aprovechar aquí? ¿O tendré que crear el mío?

Respuesta

13

Puede utilizar el Custom Date and Time Format Strings.

mar, 06 de Dic 2011 20:24:15 GMT

generar el formato anterior de este modo:

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

Tenga en cuenta que este código no es insensible a la cultura y formateará la fecha utilizando la configuración regional del servidor. Usted debe usar 'thedate.ToString (" R ")' o 'thedate.ToString (" ddd, dd MMM aaaa HH: mm: ss 'GMT' ", DateTimeFormatInfo.InvariantInfo)' –

+0

Por supuesto, usted todavía tiene que llamar '.ToUniversalTime()'. –

+0

Según lo sugerido por Steve B y en Jonno [respuesta a continuación] (http://stackoverflow.com/a/17079611/361762), la cadena de formato "R" es la mejor manera de hacerlo. p.ej. 'DateTime.UtcNow.AddDays (30) .ToString (" R ")' – dave

-7

que acabó creando esto:

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

lo uso DateTime.UtcNow.AddDays(30).ToString("R")

De MSDN:

El especificador de formato estándar "R" o "r" representa una cadena de formato de fecha y hora personalizada que se define mediante la propiedad DateTimeFormatInfo.RFC1123Pattern. El patrón refleja un estándar definido y la propiedad es de solo lectura. Por lo tanto, siempre es igual, independientemente de la cultura utilizada o del proveedor de formato suministrado. La cadena de formato personalizado es "ddd, dd MMM aaaa HH": "mm": "ss" GMT "". Cuando se utiliza este especificador de formato estándar, la operación de formateo o de análisis siempre usa el cultivo invariante

+0

Esto es * definitivamente * la forma correcta de hacerlo! – mortb

+0

Esta debería ser la respuesta aceptada. – Art

1

No es necesario que pase el hilo y configure el Encabezado. Todo lo que necesita, es posible configurar la propiedad LastModified:

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

Ni siquiera necesita wory acerca de pasar la hora UTC, que lo hace por ti.

Cuestiones relacionadas