Pregunta

Utilizo estos códigos para convertir la fecha y hora actual y los resto con la fecha y hora que los usuarios escriben en un cuadro de texto.Pero da un error al realizar la conversión.

PersianCalendar p = new System.Globalization.PersianCalendar();
DateTime date = new DateTime();
date = DateTime.Parse(DateTime.Now.ToShortDateString());
int year = p.GetYear(date);
int month = p.GetMonth(date);
int day = p.GetDayOfMonth(date);
string str = string.Format("{0}/{1}/{2}", year, month, day);
DateTime d1 = DateTime.Parse(str);
DateTime d2 = DateTime.Parse(textBox9.Text);
string s = (d2 - d1).ToString().Replace(".00:00:00", "");
textBox10.Text = (d2 - d1).ToString().Replace(".00:00:00","");

Esta línea generará un error al convertir fecha y hora de cadena a fecha y hora:DateTime d1 = DateTime.Parse(str);

Por favor ayúdame a resolver este problema.

gracias de antemano

¿Fue útil?

Solución 4

Resolví ese problema.Se debe a la excepción en algunos meses, por lo que si desea menos dos veces, los dos días, debe convertir tanto al calendario gregoriano, entonces puede menoslos y ver el resultado.

Aquí están los códigos:

PersianCalendar p = new PersianCalendar();
        string PersianDate1 = textBox1.Text;
        string[] parts = PersianDate1.Split('/', '-');
        DateTime dta1 = p.ToDateTime(Convert.ToInt32(parts[0]), Convert.ToInt32(parts[1]), Convert.ToInt32(parts[2]), 0, 0, 0, 0);
        string PersianDate2 = textBox2.Text;
        string[] parts2 = PersianDate2.Split('/', '-');
        DateTime dta2 = p.ToDateTime(Convert.ToInt32(parts2[0]), Convert.ToInt32(parts2[1]), Convert.ToInt32(parts2[2]), 0, 0, 0, 0);
        string s = (dta2 - dta1).ToString().Replace(".00:00:00", "");
        textBox3.Text = s; // Show the result into the textbox 

Otros consejos

No es necesario analizar la fecha aquí.

Editar:

Originalmente solo quería señalar el error en el procesamiento de OP con esta respuesta. Pero creo que una respuesta completa sería mejor (a pesar de la demora :)) Y sí, sé que la representación de la fecha intermedia no se parece a la fecha persiana.Pero no es lo que se necesita.Este código proporciona la diferencia adecuada entre la fecha actual y la fecha en que el usuario pone en.

string userInput = "1394/02/31";
System.DateTime date = System.DateTime.Today;
System.Globalization.PersianCalendar p = new System.Globalization.PersianCalendar();

int year = p.GetYear(date);
int month = p.GetMonth(date);
int day = p.GetDayOfMonth(date);
System.DateTime currentDate = new System.DateTime(year, month, 1);
currentDate = currentDate.AddDays(day - 1);

// validation omitted
System.String[] userDateParts = userInput.Split(new[] { "/" }, System.StringSplitOptions.None);
int userYear = int.Parse(userDateParts[0]);
int userMonth = int.Parse(userDateParts[1]);
int userDay = int.Parse(userDateParts[2]);
System.DateTime userDate = new System.DateTime(userYear, userMonth, 1);
userDate = userDate.AddDays(userDay - 1);

System.TimeSpan difference = currentDate.Subtract(userDate);

Sólo usa el ToDateTime método en el PersianCalendar clase:

PersianCalendar p = new PersianCalendar();
DateTime now = DateTime.Now;
DateTime dateT = p.ToDateTime(now.Year, now.Month, now.Day, 0, 0, 0, 0);

Luego, para obtener su cadena en ese formato, simplemente haga:

string str = dateT.ToShortDateString();

Su problema real parece radicar en analizar la fecha que el usuario ingresó en formato de calendario persa.Entonces, si el usuario ingresó 1391/2/31 quieres poder analizar eso.Hoy (19 de mayo de 2012) es 1391/2/30 entonces finalmente quieres mostrar algo como 1 day remaining.

Esta pregunta tiene sido preguntado antes.Sin embargo, la respuesta aceptada allí simplemente intenta usar

string persianDate = "1390/02/07";
CultureInfo persianCulture = new CultureInfo("fa-IR");
DateTime persianDateTime = DateTime.ParseExact(persianDate, 
    "yyyy/MM/dd", persianCulture);

Lo cual no funcionará para una cita como 1391/2/31.Entonces creo que tendrías que implementar el análisis tú mismo.

Sin implementar ninguna verificación de errores y asumiendo que el usuario siempre usa el formato yyyy/mm/dd podrías usar:

// Convert Persian Calendar date to regular DateTime
var persianDateMatch = System.Text.RegularExpressions.Regex.Match(
    persianTargetTextBox.Text, @"^(\d+)/(\d+)/(\d+)$");
var year = int.Parse(persianDateMatch.Groups[1].Value);
var month = int.Parse(persianDateMatch.Groups[2].Value);
var day = int.Parse(persianDateMatch.Groups[3].Value);
var pc = new System.Globalization.PersianCalendar();
var target = pc.ToDateTime(year, month, day, 0, 0, 0, 0);

var difference = target - DateTime.Today;
differenceLabel.Text = difference.TotalDays.ToString("0");

Deberías comprobar si la expresión regular realmente encontró alguna coincidencia.También tendrías que comprobar si pc.ToDateTime no arroja un error.Desafortunadamente, no parece existir nada como DateTime.TryParse para el calendario persa.

De todos modos, no necesita analizar el día de hoy en un calendario persa, solo necesita analizar la entrada del usuario.

Usted también puede estar interesado en Biblioteca farsi: trabajar con fechas, calendarios y selectores de fechas, aunque el artículo es muy antiguo (2007).

Aquí es donde la documentación es su amigo:

Clase Persiancalendar

Constructor DateTime (INT32, INT32, INT32, Calendario) < / p>

Este es el código exacto que necesitaría:

PersianCalendar p = new System.Globalization.PersianCalendar();
DateTime today = DateTime.Today;
DateTime pDate = new DateTime(p.GetYear(today), p.GetMonth(today), p.GetDayOfMonth(today), p);
DateTime d2 = DateTime.Parse(textBox9.Text);
// THIS NEEDS TO BE EXPLAINED
textBox10.Text = (d2 - pDate).ToString().Replace(".00:00:00","");

En última instancia, ¿qué estás tratando de hacer? ¿Cuáles son los resultados que está esperando en textBox10? Si desea la cantidad de días entre las dos fechas, solo haga (d2 - pDate).ToString("d") y obtendrá la diferencia en los días. Tal vez si explicó un poco más lejos lo que está tratando de hacer, en lugar de cómo está tratando de hacerlo, posiblemente podemos ayudarlo a más.

Editar: Acabo de darme cuenta de lo que comecme estaba diciendo. La línea que causaría el problema está aquí:

DateTime d2 = DateTime.Parse(textBox9.Text);

En su lugar, tendríamos que cambiarlo para usar también la información de la cultura:

CultureInfo persianCulture = new CultureInfo("fa-IR");
DateTime d2 = DateTime.Parse(textBox9.Text, persianCulture)

Editar: usted es correcto, solo permite analizar la fecha en el formato persa, pero no valida de acuerdo con un calendario en particular. Para que esto funcione correctamente, tendrá que analizar manualmente la fecha e instanciará un nuevo DateTime con el Persiancalendar suministrado:

DateTime d2;
if(Regex.IsMatch(textBox9.Text, "^dddd/dd/dd$"))
{
    d2 = new DateTime(
        int.Parse(textBox9.Substring(0,4)), 
        int.Parse(textBox9.Substring(5, 2)), 
        int.Parse(textBox9.Substring(8, 2)),
        p);
}

Solo tiene que asegurarse de que la entrada cambie definitivamente el formato que especifique, de lo contrario, no hay manera de analizar con precisión el DateTime con precisión.

Puede usar este código:

  DateTime today = DateTime.Today; // excludes h/m/s

  DateTime userdate = DateTime.Parse(textBox9.Text);

Si restantes uno de los otros, obtienes un Timespan.

  TimeSpan diff = today - userDate;

Puede usar las propiedades de este tipo de tiempo para mostrarles la forma en que le guste.

Para administrar el formulario de conversión / al calendario persa, tiene una buena solución aquí:

.NET ¿Cómo analizar una cadena de fecha para el persa (calendario jalali) en un objeto DateTime?

Referencias:

DateTime.today

Timespan

Aquí hay un código que estoy usando:

  public DateTime ConvertPersianToEnglish(string persianDate)
        {
            string[] formats = { "yyyy/MM/dd", "yyyy/M/d", "yyyy/MM/d", "yyyy/M/dd" };
            DateTime d1 = DateTime.ParseExact(persianDate, formats,
                                              CultureInfo.CurrentCulture, DateTimeStyles.None);
            PersianCalendar persian_date = new PersianCalendar();
            DateTime dt = persian_date.ToDateTime(d1.Year, d1.Month, d1.Day, 0, 0, 0, 0, 0);
            return dt;
        }

Esto se puede hacer mucho más fácil usar noda tiempo :

using System.Globalization;
using NodaTime;
using NodaTime.Text;

...

CultureInfo culture = CultureInfo.CreateSpecificCulture("fa-IR");
CalendarSystem calendar = CalendarSystem.GetPersianCalendar();
LocalDate template = new LocalDate(1, 1, 1, calendar);
LocalDatePattern pattern = LocalDatePattern.Create("yyyy/M/d", culture, template);
LocalDate result = pattern.Parse("1391/2/30").Value;

// if you need a DateTime, then:
DateTime dt = result.AtMidnight().ToDateTimeUnspecified();

También puede usar la siguiente biblioteca .NET para usar Persiancalendar tan fácil como DateTime:

calendario persa (persianDateTime) en C #

var persianDateTime = PersianDateTime.Now;
persianDateTime.EnglishNumber = true;
Console.Write(persianDateTime.ToString());

Pruebe este código: Este código se edita el código que publicado por "GRZEGORZ W", pero su código genera un error, por ejemplo, cuando la fecha de entrada del usuario="1394/06/31" y el error es "El año, el mes y los parámetros del día describen un DateTime" no representable "

por debajo del código está bien:

string userInput = "1394/02/31";
System.DateTime date = System.DateTime.Today;
System.Globalization.PersianCalendar p = new System.Globalization.PersianCalendar();

int year = p.GetYear(date);
int month = p.GetMonth(date);
int day = p.GetDayOfMonth(date);
System.DateTime currentDate = new System.DateTime(year, month, day,p);


System.String[] userDateParts = userInput.Split(new[] { "/" },      System.StringSplitOptions.None);
int userYear = int.Parse(userDateParts[0]);
int userMonth = int.Parse(userDateParts[1]);
int userDay = int.Parse(userDateParts[2]);
System.DateTime userDate = new System.DateTime(userYear, userMonth, userDay,p);


System.TimeSpan difference = currentDate.Subtract(userDate);

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top