una - formato fecha datetime c#
convertir la fecha de C#en cadena y viceversa (5)
Estoy convirtiendo la fecha de C # en cadena. Más tarde, cuando lo convierto de nuevo al objeto DateTime , parece que no son iguales.
const string FMT = "yyyy-MM-dd HH:mm:ss.fff";
DateTime now1 = DateTime.Now;
string strDate = now1.ToString(FMT);
DateTime now2 = DateTime.ParseExact(strDate, FMT, CultureInfo.InvariantCulture);
Console.WriteLine(now1.ToBinary());
Console.WriteLine(now2.ToBinary());
Aquí está el ejemplo. Parece que todo está incluido en el formato de cadena, cuando imprimo la fecha, ambos muestran lo mismo, pero cuando comparo los objetos o imprimo la fecha en formato binario, veo la diferencia. Me parece extraño, ¿podría explicar qué está pasando aquí?
Aquí está la salida para el código anterior.
-8588633131198276118
634739049656490000
2 cosas:
Puede usar la sobrecarga ParseExact que toma un parámetro DateTimeStyle para especificar
AssumeLocal
.Todavía habrá una pequeña diferencia entre now1 y now2 a menos que aumente la precisión a 7 dígitos en lugar de 3: "aaaa-MM-dd HH: mm: ss.fffffff"
const string FMT = "yyyy-MM-dd HH:mm:ss.fffffff"; DateTime now1 = DateTime.Now; string strDate = now1.ToString(FMT); DateTime now2 = DateTime.ParseExact(strDate, FMT, CultureInfo.InvariantCulture, DateTimeStyles.AssumeLocal); Console.WriteLine(now1.ToBinary()); Console.WriteLine(now2.ToBinary());
Incluso sin los cambios anteriores, la diferencia calculada entre ahora1 y ahora2 parece pequeña, aunque los valores binarios no parecen similares.
TimeSpan difference = now2.Subtract(now1);
Console.WriteLine(difference.ToString());
Debe utilizar el especificador de formato de roundtrip
y roundtrip
"O" o "o" si desea conservar el valor del DateTime
.
El especificador de formato estándar "O" o "o" representa una cadena de formato de fecha y hora personalizada que utiliza un patrón que conserva la información de zona horaria. Para los valores de DateTime, este especificador de formato está diseñado para conservar los valores de fecha y hora junto con la propiedad DateTime.Kind en el texto. La cadena formateada puede analizarse usando el método DateTime.Parse (String, IFormatProvider, DateTimeStyles) o DateTime.ParseExact si el parámetro styles está configurado en DateTimeStyles.RoundtripKind.
Usando su código (aparte de cambiar la cadena de formato):
const string FMT = "O";
DateTime now1 = DateTime.Now;
string strDate = now1.ToString(FMT);
DateTime now2 = DateTime.ParseExact(strDate, FMT, CultureInfo.InvariantCulture);
Console.WriteLine(now1.ToBinary());
Console.WriteLine(now2.ToBinary());
Yo obtengo:
-8588633127598789320
-8588633127598789320
La respuesta de Oded es buena, pero no me funcionó para las fechas UTC. Para que funcionara para las fechas UTC, necesitaba especificar un valor de DateTimeStyles de "RoundtripKind" para que no tratara de asumir que era una hora local. Aquí está el código actualizado de arriba:
const string FMT = "O";
DateTime now1 = DateTime.Now;
string strDate = now1.ToString(FMT);
DateTime now2 = DateTime.ParseExact(strDate, FMT, CultureInfo.InvariantCulture, DateTimeStyles.RoundtripKind);
Console.WriteLine(now1.ToBinary());
Console.WriteLine(now2.ToBinary());
Tenga en cuenta que esto funciona tanto para fechas UTC como locales.
Si no necesita que la cadena sea legible para el ser humano (por ejemplo, desea cifrarla antes del almacenamiento), puede llamar a la string str = dt1.ToBinary().ToString();
y DateTime dt2 = DateTime.FromBinary(long.Parse(str));
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
namespace DateTimeConvert
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void button1_Click(object sender, EventArgs e)
{
label1.Text = ConvDate_as_str(textBox1.Text);
}
public string ConvDate_as_str(string dateFormat)
{
try
{
char[] ch = dateFormat.ToCharArray();
string[] sps = dateFormat.Split('' '');
string[] spd = sps[0].Split(''.'');
dateFormat = spd[0] + ":" + spd[1] + " " + sps[1];
DateTime dt = new DateTime();
dt = Convert.ToDateTime(dateFormat);
return dt.Hour.ToString("00") + dt.Minute.ToString("00");
}
catch (Exception ex)
{
return "Enter Correct Format like <5.12 pm>";
}
}
private void button2_Click(object sender, EventArgs e)
{
label2.Text = ConvDate_as_date(textBox2.Text);
}
public string ConvDate_as_date(string stringFormat)
{
try
{
string hour = stringFormat.Substring(0, 2);
string min = stringFormat.Substring(2, 2);
DateTime dt = new DateTime();
dt = Convert.ToDateTime(hour+":"+min);
return String.Format("{0:t}", dt); ;
}
catch (Exception ex)
{
return "Please Enter Correct format like <0559>";
}
}
}
}
Simplemente use este código para convertir la fecha y hora en cadena y la cadena en fecha y hora
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Text; using System.Windows.Forms; namespace DateTimeConvert { public partial class Form1 : Form { public Form1() { InitializeComponent(); } private void button1_Click(object sender, EventArgs e) { label1.Text = ConvDate_as_str(textBox1.Text); } public string ConvDate_as_str(string dateFormat) { try { char[] ch = dateFormat.ToCharArray(); string[] sps = dateFormat.Split('' ''); string[] spd = sps[0].Split(''.''); dateFormat = spd[0] + ":" + spd[1] + " " + sps[1]; DateTime dt = new DateTime(); dt = Convert.ToDateTime(dateFormat); return dt.Hour.ToString("00") + dt.Minute.ToString("00"); } catch (Exception ex) { return "Enter Correct Format like <5.12 pm>"; } } private void button2_Click(object sender, EventArgs e) { label2.Text = ConvDate_as_date(textBox2.Text); } public string ConvDate_as_date(string stringFormat) { try { string hour = stringFormat.Substring(0, 2); string min = stringFormat.Substring(2, 2); DateTime dt = new DateTime(); dt = Convert.ToDateTime(hour+":"+min); return String.Format("{0:t}", dt); ; } catch (Exception ex) { return "Please Enter Correct format like <0559>"; } } } }