2009-09-08 33 views
14

Estoy buscando una forma de adquirir una fecha larga sin el día de la semana. ¿Tal bestia existe?Cómo obtener un formato de fecha larga de DateTime sin día de la semana

A continuación se muestra el código que utilizo para obtener el formato de fecha larga incluyendo el día de la semana:

DateTime time = ... 
String formattedDate = time.ToLongDateString(); 

Editar

ejemplos de lo que me gustaría ver:

  • en -us: 5 de diciembre de 2009
  • fr-fr: 5 décembre 2009
  • es-ES: 05 de diciembre de 2009

ToLongDateString() devuelve lo siguiente:

  • es-: Sábado, 5 de diciembre de, 2009
  • fr-fr: samedi 5 décembre 2009
  • es-ES: sábado, 05 de diciembre de 2009

Respuesta

8

Esto parecía hacer el truco.

  1. Enumerar todos los patrones de fecha y hora válidas: CultureInfo.DateTimeFormat.GetAllDateTimePatterns
  2. Seleccione el patrón más largo (probablemente esta es la opción ideal) que:
    • es una subcadena de la CultureInfo.DateTimeFormat.LongDatePattern
    • no contiene "DDD" (nombre de día corto)
    • no contiene "dddd" (nombre largo día)

Parece que esto viene con las cuerdas que estaba buscando.

Ver código de abajo:

class DateTest 
{ 
    static private string GetDatePatternWithoutWeekday(CultureInfo cultureInfo) 
    { 
     string[] patterns = cultureInfo e.DateTimeFormat.GetAllDateTimePatterns(); 

     string longPattern = cultureInfo.DateTimeFormat.LongDatePattern; 

     string acceptablePattern = String.Empty; 

     foreach (string pattern in patterns) 
     { 
      if (longPattern.Contains(pattern) && !pattern.Contains("ddd") && !pattern.Contains("dddd")) 
      { 
       if (pattern.Length > acceptablePattern.Length) 
       { 
        acceptablePattern = pattern; 
       } 
      } 
     } 

     if (String.IsNullOrEmpty(acceptablePattern)) 
     { 
      return longPattern; 
     } 
     return acceptablePattern; 
    } 

    static private void Test(string locale) 
    { 
     DateTime dateTime = new DateTime(2009, 12, 5); 

     Thread.CurrentThread.CurrentCulture = new CultureInfo(locale); 

     string format = GetDatePatternWithoutWeekday(Thread.CurrentThread.CurrentCulture); 

     string result = dateTime.ToString(format); 

     MessageBox.Show(result);    
    } 
} 

Técnicamente, probablemente no funcionaría si un formato largo tenía el nombre del día intercalado en medio. Para eso, debería elegir el patrón con la subcadena común más larga en lugar de la coincidencia exacta más larga.

0

Probar:

DateTime time = .... 
string formmattedDate = time.Day.ToString() + " " + time.ToString("MMMM"); 
2

Si la secuencia LongDate también es específica de la cultura, me temo que no tiene suerte y tendrá que escribir el código real para esto. De lo contrario, una colección de formatting tags hará el truco.

Me temo que lo que tendrá que hacer es crear una matriz de 7 cadenas (una para cada día) en la cultura local, y eliminar esas cadenas de su salida de formato LongDate. Luego asegúrese de eliminar todos los '/ s duplicados y espacios.

Espero que haya una mejor manera, pero yo no lo veo.

+0

pidiendo un resultado erróneo (una cadena con el día de la semana) y tratando de munge a una forma aceptable (borrando el día de la semana) es un sustituto muy pobre para simplemente pedir una cadena de fecha formateada apropiadamente en primer lugar. –

+0

@ Stephen: Estoy de acuerdo. Pero, ¿cómo sabes el formato adecuado para la cultura actual? El orden de Año, mes y día, los caracteres de separación, etc. etc. –

+1

@David: exactamente, no puede. Si es importante, tendrá que buscar el formato adecuado para cada cultura, como Microsoft ha hecho con cultureInfo.DateTimeFormat.LongDatePattern. –

3

A, horrible manera muy horrible de lograr esto es eliminar los especificadores de formato que no desee de la LongDatePattern existente:

public static string CorrectedLongDatePattern(CultureInfo cultureInfo) 
{ 
    var info = cultureInfo.DateTimeFormat; 

    // This is bad, mmmkay? 
    return Regex.Replace(info.LongDatePattern, "dddd,?",String.Empty).Trim(); 
} 
+0

Esto es agradable y simple, pero no maneja * todos * los casos. Por ejemplo ka-GE es "aaaa" წლის 'dd MM, dddd ". Esta respuesta dejaría la coma final –

+0

de acuerdo, es una solución "muy horrible, horrible": D Usted podría agregar eso a la expresión regular: /,? \ S * dddd,?/ – user7116

+0

Creo que agregar eso a la expresión regular ayudaría Sí, –

5
String formattedDate = DateTime.Now.Date.ToLongDateString().Replace(DateTime.Now.DayOfWeek.ToString()+ ", ", "") 
-1

Lo malo:

var ci = CultureInfo.CreateSpecificCulture("nl-NL"); 
var date1 = DateTime.ParseExact(date, "dd MMM yyyy", ci); 
+0

Supongamos que desea dd MMM aaaa, que usaría el nombre del mes específico de la configuración regional, pero no el formato. Vea los ejemplos en la pregunta. –

-1

Sólo especifique el formato:

DateTime.ToString("MMMM dd, yyyy"); 
+0

Suponiendo que desea MMMM dd, aaaa, que usaría el nombre del mes específico de la configuración regional, pero no el formato. Vea los ejemplos en la pregunta. –

1

Este es un viejo, viejo culata en T, pero me encontré con él porque empareja perfectamente el caso de uso Necesitaba resolver Terminé escribiendo un código que funciona, así que pensé en incluirlo para aquellos que lo necesitan. (Tiene algunos trucos adicionales, como el impago a la fecha actual, y permitiendo que sea la cadena completa fecha para una cultura, o uno con el día-de-la-semana eliminado):

public string DateString(DateTime? pDt = null, string lang, bool includeDayOfWeek = true) 
{ 
    if (pDt == null) pDt = DateTime.Now; 
    DateTime dt = (DateTime)pDt; 

    System.Globalization.CultureInfo culture = null; 
    try { culture = new System.Globalization.CultureInfo(lang); } 
     catch{ culture = System.Globalization.CultureInfo.InvariantCulture; } 

    string ss = dt.ToString("D", culture); 
    if (!includeDayOfWeek) 
    { 
     // Find day-of-week string, and remove it from the date string 
     // (including any trailing spaces or punctuation) 
     string dow = dt.ToString("dddd", culture); 
     int len = dow.Length; 
     int pos = ss.IndexOf(dow); 
     if (pos >= 0) 
     { 
      while (((len + pos) < ss.Length) && (!Char.IsLetterOrDigit(ss[len+pos]))) 
      len++; 
      ss = ss.Substring(0, pos) + ss.Substring(len+pos, ss.Length - (len+pos)); 
     } 
    } 
    return ss; 
} 
0

Por qué no conseguir LongDate y recortar la primera parte donde aparece el día de la semana?

DateTime date = Convert.ToDateTime(content["DisplayDate"]); 
    //-->3/15/2016 2:09:13 PM 

string newDate = date.ToString("D", new CultureInfo("es-ES")); 
    //--> martes, 15 de marzo de 2016 

var index = newDate.IndexOf(",") + 1; 
    //--> 7 

string finalDate = newDate.Substring(index); 
    //--> 15 de marzo de 2016 
+0

Porque en algunas culturas, el día de la semana podría no aparecer en el frente. –

0

Mensaje viejo, pero estoy usando esto:

public static string ToLongDateWithoutWeekDayString(this DateTime source) 
{ 
    return source.ToLongDateString() 
       .Replace(source.DayOfWeek.ToString(), "") 
       .Trim(',', ' '); 
} 
1

he ampliado en la sugerencia de Bart Calixto para solucionar el problema de formato aaaa dd MMM (aquí en Australia también utilizamos fecha de Reino Unido formato dd/mm/aa)

También con frecuencia necesito convertir entre los formatos de fecha Aust y US.

Este código soluciona el problema (mi versión es en VB)

Public Shared Function ToLongDateWithoutWeekDayString(source As DateTime, cult As System.Globalization.CultureInfo) As String 

Return source.ToString("D", cult).Replace(source.DayOfWeek.ToString(), "").Trim(","c, " "c) 

End Function 

Antes de llamar a la función que necesita para establecer la cultura, lo hago de esta manera después de conseguir el país del visitante de http://ipinfo.io

Select Case Country.country 
      Case "AU" 
       cult = New CultureInfo("en-AU") 
      Case "US" 
       cult = New CultureInfo("en-US") 
      Case "GB" 
       cult = New CultureInfo("en-GB") 
     End Select 

Dim date1 As New Date(2010, 8, 18) 
lblDate.Text = ToLongDateWithoutWeekDayString(date1, cult) 

Después de configurar el resultado de la cultura AU o GB es el 18 de agosto de 2010

Después de establecer el resultado de la cultura de EE. UU. Es el 18 de agosto de 2010

Adam ¿Estás de acuerdo con esto resuelve el problema de formato al que te refieres?

Gracias Bart que era un código muy agradable.

No olvides agregar Dim cult As System.Globalization.CultureInfo después de Inherits System.Web.UI.Página

+0

Sugiero reemplazar 'source.DayOfWeek.ToString()' con 'source.ToString (" dddd ", cult)' para que funcione en otros idiomas, no solo en inglés. –

0

Mi solución:

DateTime date = DateTime.Now; 
CultureInfo culture = CultureInfo.CurrentCulture; 
string dayName = date.ToString("dddd", culture); 
string fullDate = date.ToString("f", culture); 
string trim = string.Join(" ", fullDate.Replace(dayName, "").TrimStart(',').TrimStart(' ').Split(new[] { ' ' }, StringSplitOptions.RemoveEmptyEntries)); 

La última línea:

  1. Elimina comas sobrantes en el arranque
  2. Elimina el espacio sobrante en el arranque
  3. Elimina los restos de doble espacio desde cualquier lugar del cadena

Probado para cada cultivo a partir

CultureInfo[] cultures = CultureInfo.GetCultures(CultureTypes.AllCultures); 
Cuestiones relacionadas