PDA

View Full Version : سوال: تبدیل تاریخ شمسی به میلادی



علی فتحی
چهارشنبه 15 مرداد 1393, 22:07 عصر
سلام ببخشید این تاپیک رو ایجاد کردم خیلی جستجو کردم به نتیجه نرسیدم
من دوتا تاریخ دارم توی جدول یکی تاریخ میلادی و دیگری تاریخ شمسی
فقط تاریخ شمسی رو در تکس باکس وارد میکنم . میخوام اتوماتیک تاریخ میلادی تو تکس باکس بعدی ایجاد بشه
این کد رو برای تبدیل میلادی به شمسی دارم.

System.Globalization.
PersianCalendar p = new System.Globalization.PersianCalendar();

maskedTextBoxAdv1.Text = p.GetYear(
DateTime.Now).ToString() + "/" + p.GetMonth(DateTime.Now).ToString("0#") + "/" + p.GetDayOfMonth(DateTime.Now).ToString("0#");


ولی راه تبدیل شمسی به میلادی رو بلد نیستم
یعنی تاریخی که در تکس باکس 1 مینویسم 1390/01/01 چگونه در تکس باکس دوم همینو تبدیل به میلادی بکنم
با تشکر

System.Globalization.
PersianCalendar p = new System.Globalization.PersianCalendar();


DateTime datetime = newDateTime(p);

datetime =
DateTime.Now;

maskedTextBox1.Text = datetime.ToShortDateString();


این تاریخ روز سیستم رو بر میگردونه ولی من میخوام تاریخ دستی تکس باکس رو بر گردونه

DateTime datetime = newDateTime();

datetime =
DateTime.Now;

maskedTextBox1.Text = datetime.ToShortDateString();

kahe.mehrdad
چهارشنبه 15 مرداد 1393, 23:00 عصر
دوست من شما میتونی از این کد کمک بگیری، فقط کافیه ساعت و دقیقه را ازش کم کنید و هدر using System.Globalization; را هم به namespace پروژه تون اضافه کنید.

public static string ToPersian(this DateTime dt)
{
PersianCalendar pc = new PersianCalendar();
int year = pc.GetYear(dt);
int month = pc.GetMonth(dt);
int day = pc.GetDayOfMonth(dt);
int hour = pc.GetHour(dt);
int min = pc.GetMinute(dt);


DateTime PersianDateTime = new DateTime(year, month, day, hour, min, 0);


return PersianDateTime.ToString("yyyy/MM/dd HH:mm");
}


public static DateTime ToMiladi(this DateTime dt)
{
PersianCalendar pc = new PersianCalendar();
return pc.ToDateTime(dt.Year, dt.Month, dt.Day, dt.Hour, dt.Minute, 0, 0);
}

علی فتحی
پنج شنبه 16 مرداد 1393, 00:24 صبح
تشکر از جوابتون ولی نشد توی این قسمت اخطار میده dt.Minute, 0, 0);

علی فتحی
پنج شنبه 16 مرداد 1393, 00:38 صبح
Specified time is not supported in this calendar. It should be between 03/21/0622 00:00:00 (Gregorian date) and 12/31/9999 23:59:59 (Gregorian date), inclusive.
Parameter name: time

علی فتحی
پنج شنبه 16 مرداد 1393, 00:45 صبح
اینا رو کلا امتحان کردم نشد که نشد



PersianCalendar pc = new PersianCalendar();;


DateTime dt = new DateTime();


int year = pc.GetYear(dt);


int month = pc.GetMonth(dt);


int day = pc.GetDayOfMonth(dt);


// textBoxX6.Text = pc.ToString();


textBoxX7.Text = dt.Year +
"/" + dt.Month + "/" + dt.Day;

textBoxX6.Text = pc.ToDateTime(dt.Year, dt.Month, dt.Day);



//DateTime datetime = new DateTime();


//datetime = DateTime.Now;


//maskedTextBox1.Text = datetime.ToShortDateString();



// System.Globalization.PersianCalendar p = new System.Globalization.PersianCalendar();


// maskedTextBoxAdv1.Text = p.GetYear(DateTime.Now).ToString() + "/" + p.GetMonth(DateTime.Now).ToString("0#") + "/" + p.GetDayOfMonth(DateTime.Now).ToString("0#");

علی فتحی
پنج شنبه 16 مرداد 1393, 01:05 صبح
نشد تبدیل میلادی به شمسی زیاده ولی برعکسش پیدا نمیشه؟

aminmousavi
پنج شنبه 16 مرداد 1393, 03:46 صبح
سلام دوست عزیز ، فکر کنم مقداری کار تون واجب و فورس بوده !
برای تبدیل شمسی به میلادی از متد زیر میتونین استفاده کنین :



public string ConvertShmasiToMiladi(string tarikh)
{
try
{
tarikh = tarikh.Replace("/", "");
int year;
int month;
int day;
year = Convert.ToInt32(tarikh.Substring(0, 4));
month = Convert.ToInt32(tarikh.Substring(4, 2));
day = Convert.ToInt32(tarikh.Substring(6, 2));
System.Globalization.PersianCalendar x = new System.Globalization.PersianCalendar();
DateTime dt = x.ToDateTime(year, month, day, 0, 0, 0, 0, 0);


string _day = (dt.Day).ToString();
if (_day.Length == 1) { _day = "0" + _day; }
string _month = (dt.Month).ToString();
if (_month.Length == 1) { _month = "0" + _month; }
string _year = (dt.Year).ToString();
return _year + "-" + _month + "-" + _day;
}
catch
{
return ShortDateMiladi.Replace("/", "-");
}
}

kahe.mehrdad
پنج شنبه 16 مرداد 1393, 08:20 صبح
تشکر از جوابتون ولی نشد توی این قسمت اخطار میده dt.Minute, 0, 0);
دوست من اون کد مشکلی نداره. احتمالا مقادیر را بد وارد کردید. این برنامه Windows Form را اجرا کنید کارتون راه میفته.

kahe.mehrdad
پنج شنبه 16 مرداد 1393, 08:23 صبح
سلام دوست عزیز ، فکر کنم مقداری کار تون واجب و فورس بوده !
برای تبدیل شمسی به میلادی از متد زیر میتونین استفاده کنین :



public string ConvertShmasiToMiladi(string tarikh)
{
try
{
tarikh = tarikh.Replace("/", "");
int year;
int month;
int day;
year = Convert.ToInt32(tarikh.Substring(0, 4));
month = Convert.ToInt32(tarikh.Substring(4, 2));
day = Convert.ToInt32(tarikh.Substring(6, 2));
System.Globalization.PersianCalendar x = new System.Globalization.PersianCalendar();
DateTime dt = x.ToDateTime(year, month, day, 0, 0, 0, 0, 0);


string _day = (dt.Day).ToString();
if (_day.Length == 1) { _day = "0" + _day; }
string _month = (dt.Month).ToString();
if (_month.Length == 1) { _month = "0" + _month; }
string _year = (dt.Year).ToString();
return _year + "-" + _month + "-" + _day;
}
catch
{
return ShortDateMiladi.Replace("/", "-");
}
}



کد آقای موسوی هم اجرا میشه. البته به جای قسمت آخر (تبدیل به String) میشه از متد ToShortDateString() استفاده کرذ.

علی فتحی
چهارشنبه 05 شهریور 1393, 23:38 عصر
private void maskedTextBoxAdv1_ButtonCustomClick(object sender, EventArgs e) { System.Globalization.PersianCalendar p = new System.Globalization.PersianCalendar(); maskedTextBoxAdv1.Text = p.GetYear(DateTime.Now).ToString() + "/" + p.GetMonth(DateTime.Now).ToString("0#") + "/" + p.GetDayOfMonth(DateTime.Now).ToString("0#");
} private void maskedTextBoxAdv1_TextChanged(object sender, EventArgs e) { try { DateTime datetime = new DateTime(); datetime = DateTime.Now; maskedTextBoxAdv2.Text = datetime.ToShortDateString();
} catch (Exception) { }تبدیل تاریخ تکس باکس به تاریخ میلادی . نمیشه امکان نداره . سورسی که گذاشتید درسته ولی من میخوام کنترل بسازم کلاس قبول نمیکنه

علی فتحی
پنج شنبه 06 شهریور 1393, 01:41 صبح
مشکل این کد چیه عمل نمیکنه

namespace Ali{ public partial class DateM : UserControl { System.Globalization.PersianCalendar p = new System.Globalization.PersianCalendar(); DateTime dt = new DateTime(); public DateM() { InitializeComponent(); }
private void maskedTextBoxAdv1_ButtonCustomClick(object sender, EventArgs e) { maskedTextBoxAdv1.Text = p.GetYear(DateTime.Now).ToString() + "/" + p.GetMonth(DateTime.Now).ToString("0#") + "/" + p.GetDayOfMonth(DateTime.Now).ToString("0#");
} private void maskedTextBoxAdv1_TextChanged(object sender, EventArgs e) { try { PersianCalendar pc = new PersianCalendar(); pc.ToDateTime(dt.Year, dt.Month, dt.Day,0,0,0,0); maskedTextBoxAdv2.Text = dt.Year.ToString() + "/" + dt.Month.ToString("0#") + "/" + dt.Day.ToString("0#"); // dt = DateTime.Now; // maskedTextBoxAdv2.Text = dt.ToShortDateString();
} catch (Exception) { }

علی فتحی
پنج شنبه 06 شهریور 1393, 02:11 صبح
پیوست اقا مهرداد کار میکنه .اما ایا میشه بدون استفاده از کلاس اینکار و کرد. اگر میشه کلاسو از سورس دربیارین روی خود فرم اجرا کنین ممنون میشم

arashsoft
پنج شنبه 06 شهریور 1393, 12:13 عصر
سلام



using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;


namespace arash soft
{
public partial class Form1 : Form
{
System.Globalization.PersianCalendar pc = new System.Globalization.PersianCalendar();
System.Globalization.HijriCalendar hc = new System.Globalization.HijriCalendar();
string date1;
DateTime datetime = new DateTime();


public Form1()
{
InitializeComponent();
}


private void button1_Click(object sender, EventArgs e)
{
//تبدیل تاریخ میلادی به شمسی و قمری

date1 = comboBox3.Text + "/" + comboBox2.Text + "/" + comboBox1.Text;
DateTime dt = DateTime.Parse(date1);
label1.Text = pc.GetYear(dt) + "/" + pc.GetMonth(dt) + "/" + pc.GetDayOfMonth(dt);
label9.Text = hc.GetYear(dt) + "/" + hc.GetMonth(dt) + "/" + hc.GetDayOfMonth(dt);
label10.Text = dt.Year + "/" + dt.Month + "/" + dt.Day;

//

//تبدیل تاریخ شمسی به میلادی و قمری

date1 = comboBox3.Text + "/" + comboBox2.Text + "/" + comboBox1.Text;
DateTime dt1 = pc.ToDateTime(int.Parse(comboBox3.Text), int.Parse(comboBox2.Text), int.Parse(comboBox1.Text), 0, 0, 0, 0);
label1.Text = date1;
label9.Text = hc.GetYear(dt1) + "/" + hc.GetMonth(dt1) + "/" + hc.GetDayOfMonth(dt1);
label10.Text = dt1.Year + "/" + dt1.Month + "/" + dt1.Day;

//


//تبدیل تاریخ قمری به شمسی و میلادی

date1 = comboBox3.Text + "/" + comboBox2.Text + "/" + comboBox1.Text;
DateTime dt2 = hc.ToDateTime(int.Parse(comboBox3.Text), int.Parse(comboBox2.Text), int.Parse(comboBox1.Text), 0, 0, 0, 0);
label1.Text = pc.GetYear(dt2) + "/" + pc.GetMonth(dt2) + "/" + pc.GetDayOfMonth(dt2);
label9.Text = date1;
label10.Text = dt2.Year + "/" + dt2.Month + "/" + dt2.Day;

}

علی فتحی
پنج شنبه 06 شهریور 1393, 14:55 عصر
مرسی از جوابتون خیلی وقته سورس کد شما را دارم . ولی من کمبو باکس ندارم بلکه توی یک مسک تکست تاریخ رو دارم

sm_1366
پنج شنبه 06 شهریور 1393, 15:41 عصر
برادر
شما که این همه کد تست کردی اینم تست کن شاید به کارت اومد
کار مارو که را انداخته


public static string Miladi2Shamsi(DateTime mdate)
{
PersianCalendar pc = new PersianCalendar();
StringBuilder sdate = new StringBuilder();
sdate.Append(pc.GetYear(mdate).ToString("0000"));
sdate.Append("/");
sdate.Append(pc.GetMonth(mdate).ToString("00"));
sdate.Append("/");
sdate.Append(pc.GetDayOfMonth(mdate).ToString("00"));
return sdate.ToString();
}
public static DateTime Shamsi2Miladi(string sdate)
{
int year = int.Parse(sdate.Substring(0, 4));
int month = int.Parse(sdate.Substring(5, 2));
int day = int.Parse(sdate.Substring(8, 2));
PersianCalendar p = new PersianCalendar();
DateTime mdate = p.ToDateTime(year, month, day, 0, 0, 0, 0);
return mdate;
}

elec60
پنج شنبه 06 شهریور 1393, 16:05 عصر
private void solarMaskedTextBox_TextChanged(object sender, EventArgs e)
{
string solarDateString = solarMaskedTextBox.Text;


if (solarDateString.Length == 10)
{
int year = int.Parse(solarDateString.Split('/')[0]);
int month = int.Parse(solarDateString.Split('/')[1]);
int day = int.Parse(solarDateString.Split('/')[2]);


GregorianCalendar gre = new GregorianCalendar(GregorianCalendarTypes.USEnglish );
DateTime dt = new DateTime(year, month, day, PC);
Text = dt.ToShortDateString();
}
}

علی فتحی
جمعه 07 شهریور 1393, 13:16 عصر
ممنون از جواب همتون ولی هیچ کدوم بدرد من نخورد.
با کلاس درست کردم که کدهای شما بدرد کلاس میخوره ولی من میخوام روی کنرلها ایجاد کنم.

اینو ببینید

http://s5.picofile.com/file/8137651142/Ali.rar.html

Mahmoud.Afrad
شنبه 08 شهریور 1393, 01:42 صبح
ابتدا باید بگم تبدیل میلادی به شمسی قبلا بارها بحث شده.

یادمه قبلا به شما گفتیم که تاریخ شمسی رو نمیشه مستقیما در قالب میلادی ذخیره کنید بلکه باید تبدیل صورت بگیره. در این کدها هم شما از متدی استفاده کردید که ورودیش باید تاریخ میلادی باشه ولی شما تاریخ شمسی بهش پاس دادی Convert.ToDateTime(maskedTextBoxAdv1.Text) که اشتباهه.

اگر منظورت کلاس Date هست باید اول روز و ماه و سال جدا بشن و بعد توسط سازنده کلاس datetime و پاس دادن یک شئ PersianCalendar به اون ، تاریخ شمسی رو به میلادی تبدیل کرد. البته بایست کنترل کنی ماه و روز در رنج صحیح باشند.

private void maskedTextBoxAdv1_TextChanged(object sender, EventArgs e)
{
if (maskedTextBoxAdv1.MaskCompleted)
{
string shamsi = maskedTextBoxAdv1.Text;
int year = Convert.ToInt32(shamsi.Substring(0, 4));
int month = Convert.ToInt32(shamsi.Substring(5, 2));
int day = Convert.ToInt32(shamsi.Substring(8, 2));

if (month < 1 || month > 12)
{
throw new FormatException("Month must be greater than or equal to 1 and less than or equal to 12");
}

if (day < 1)
{
throw new FormatException("Day can't be less than 1");
}

if (month <= 6 && day > 31)
{
throw new FormatException("Day can't be greater than 31 when month is less than or equal to 6");
}

if (month > 6 && day > 30)
{
throw new FormatException("Day can't be greater than 30 when month is greater than 6");
}

PersianCalendar p = new PersianCalendar();

DateTime dt = new DateTime(year, month, day, p);
maskedTextBoxAdv2.Text = dt.ToShortDateString();
}
}