PDA

View Full Version : نمایش تاریخ میلادی ذخیره شده در فیلد datetime به شکل شمسی در datagridview



nafisehk
چهارشنبه 01 شهریور 1391, 05:42 صبح
سلام
ممنون میشم راهنماییم کنید.

ehsan7007
چهارشنبه 01 شهریور 1391, 06:49 صبح
خب چرا شمسیش رو درج نمی کنی؟

ali_habibi1384
چهارشنبه 01 شهریور 1391, 07:12 صبح
من الگوريتمش رو توي سي شارپ مينويسم زحمت تبديل تابهش رو توي اس كيو ال خودت بكش:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;

namespace WindowsApplication2
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}

private void Form1_Load(object sender, EventArgs e)
{
//********* Test ************
MessageBox.Show(Shamsi(2005, 8, 14).ToShortDateString());
MessageBox.Show(todayShamsi().ToShortDateString()) ;
}

private DateTime todayShamsi()
{
DateTime today;
today = DateTime.Today;
string year = today.Year.ToString();
string month = today.Month.ToString();
string day = today.Day.ToString();
int Y = int.Parse(year);
int M = int.Parse(month);
int D = int.Parse(day);
return Shamsi(Y, M, D);
}
private DateTime Shamsi(int Y, int M, int D)
{
if (Y == 0)
Y = 2000;
if (Y < 100)
Y = Y + 1900;
if (Y == 2000)
{
if (M > 2)
{
DateTime Temp = new DateTime(Y, M, D);
Temp = Temp.AddDays(1);
Y = int.Parse(Temp.Year.ToString());
M = int.Parse(Temp.Month.ToString());
D = int.Parse(Temp.Day.ToString());
}
}
if (M < 3 || (M == 3 && D < 21))
Y = Y - 622;
else Y = Y - 621;
switch (M)
{
case 1: if (D < 21)
{
M = 10;
D = D + 10;
}
else
{
M = 11;
D = D - 20;
}
break;

case 2: if (D < 20)
{
M = 11;
D = D + 11;
}
else
{
M = 12;
D = D - 19;
}
break;

case 3:
if (D < 21)
{
M = 12;
D = D + 9;
}
else
{
M = 1;
D = D - 20;
}
break;

case 4:
if (D < 21)
{
M = 1;
D = D + 11;
}
else
{
M = 2; D = D - 20;
}
break;

case 5:
if (D < 22)
{
M = M - 3;
D = D + 10;
}
else
{
M = M - 2;
D = D - 21;
}
break;

case 6:
if (D < 22)
{
M = M - 3;
D = D + 10;
}
else
{
M = M - 2;
D = D - 21;
}
break;

case 7:
if (D < 23)
{
M = M - 3;
D = D + 9;
}
else
{
M = M - 2;
D = D - 22;
}
break;

case 8:
if (D < 23)
{
M = M - 3;
D = D + 9;
}
else
{
M = M - 2;
D = D - 22;
}
break;

case 9:
if (D < 23)
{
M = M - 3;
D = D + 9;
}
else
{
M = M - 2;
D = D - 22;
}
break;

case 10:
if (D < 23)
{
M = 7;
D = D + 8;
}
else
{
M = 8;
D = D - 22;
}
break;

case 11:
if (D < 22)
{
M = M - 3;
D = D + 9;
}
else
{
M = M - 2;
D = D - 21;
}
break;

case 12:
if (D < 22)
{
M = M - 3;
D = D + 9;
}
else
{
M = M - 2;
D = D - 21;
}
break;
}
DateTime Temp1 = new DateTime(Y, M, D);
return Temp1;
}
}
}

ali_habibi1384
چهارشنبه 01 شهریور 1391, 07:18 صبح
اينم لينك دانلود (http://irandelphi.ir/showthread.php?t=1196) تابع ميلادي به شمسي در SQL

uniqueboy_ara
چهارشنبه 01 شهریور 1391, 07:22 صبح
ببخشیدااا، ولی مگه ما خود آزاری داریم که اینجوری بخوایم تبدیل کنیم؟؟؟
خیلی راحت با توابع SQL CLR میشه از تو خود #C این تابع رو با استفاده از PersianDate ساخت و به SQL انتقال داد!!!
آموزشش هم توی سایت هست!

nafisehk
چهارشنبه 01 شهریور 1391, 16:15 عصر
فک کنم من سوالم و واضح مطرح نکردم.
من با تبدبل تاربخ میلادی به شمسی مشکلی ندارم .... فقط چون تاریخ و به صورت میلادی تو فیلد dataetime ذخیره کردم تو datagridview به صورت میلادی نمایش داده میشه.... حالا میخوام بدونم تو رویداد CellFormaing دیتاگرید چی بنویسم که اون ستون تاریخشش به شمسی تبدیل شه...

nafisehk
چهارشنبه 01 شهریور 1391, 16:18 عصر
خب چرا شمسیش رو درج نمی کنی؟
مرسی از پیشنهادت اما

تاربخ شمسی و که نمیتونیم تو فیلد datatime ذخیره کنیم... . و اگه تاریخ و به صورت رشته ذخیره کنم تو query گرفتن دچار مشکل میشم

ehsan7007
چهارشنبه 01 شهریور 1391, 16:28 عصر
اینو میگی؟ :

91694

nafisehk
چهارشنبه 01 شهریور 1391, 16:41 عصر
اینو میگی؟ :

91694

اگه این یه datagridview باشه و اینن تاریخ شمسی که نشون میده قبلا میلادی بوده باشه .. بله..:چشمک:

ehsan7007
چهارشنبه 01 شهریور 1391, 16:45 عصر
این datagridview هست و اونم تاریخ شمسیه ولی از اول شمسی ذخیره شده بوده ، بدون تبدیل!!
:چشمک:

nafisehk
چهارشنبه 01 شهریور 1391, 17:02 عصر
این datagridview هست و اونم تاریخ شمسیه ولی از اول شمسی ذخیره شده بوده ، بدون تبدیل!!
:چشمک:

نه پس منظورم این نیست ...

nafisehk
چهارشنبه 01 شهریور 1391, 17:04 عصر
کسی نیس که بتونه راهنماییم کنه؟؟؟

ehsan7007
چهارشنبه 01 شهریور 1391, 19:47 عصر
من هنوزم نفهمیدم چرا لقمت رو دور دهنت می چرخونی و مستقیم شمسی ذخیره نمی کنی و خودت رو این همه عذاب می ده؟؟؟!!!!!
:عصبانی++:

nafisehk
چهارشنبه 01 شهریور 1391, 21:45 عصر
من هنوزم نفهمیدم چرا لقمت رو دور دهنت می چرخونی و مستقیم شمسی ذخیره نمی کنی و خودت رو این همه عذاب می ده؟؟؟!!!!!
:عصبانی++:

گفتم که!!!!!!!
چون نمیشه تاریخ شمسی و تو datetime ذخیره کر د...:متفکر:

nafisehk
چهارشنبه 01 شهریور 1391, 21:48 عصر
دوستان کسیییی هست که بدونه چه جوری میشه تاریخی که به صورت میلادی ذخیره شده رو به شمسی تو دیتاگریدویو نمایش داد؟؟؟ تابع تبدیل مییادی به شمسی و نمی خواما.... کدی که باید تو cellformating توشته شه رو میخوام...
لطفا راهنمایی کنید

Y_Safaiee
چهارشنبه 01 شهریور 1391, 22:01 عصر
با سلام خدمت شما دوست عزیز

خوب راحته که شما بیاین تو رویداد CellFormating توسط یه متغیر تاریخ اون سلول از سطرو بگیرید سپس تاریخ و ماه و روزشو جدا و به شمسی برگردونین بعد اینطوری به اون سلول اختصاص بدین



dataGridView1.Rows[e.RowIndex].Cells[2].Value = string.Format("{0}/{1}/{2}", shyear, shmonth, shday);

موفق باشین
بایت بایت

tooraj_azizi_1035
چهارشنبه 01 شهریور 1391, 22:53 عصر
متوجه نشدم که چرا اصرار دارید تاریخ رو به شکل میلادی در دیتابیس ذخیره کنید؟ نوع char(10) چه مشکلی برای تان ایجاد می کند؟ یا چه پردازشی می خواهید انجام دهید که با این نوع امکانش نیست؟

ehsan7007
چهارشنبه 01 شهریور 1391, 23:43 عصر
منم یه روزه دارم همینه بهشون میگم ، مگه بقیه چیکار می کنن؟!!

ehsan7007
چهارشنبه 01 شهریور 1391, 23:44 عصر
نحوه ی درج کردن اطلاعاتت رو بگو تا برات کد تاریخ شمسی رو بزارم.

nafisehk
پنج شنبه 02 شهریور 1391, 04:59 صبح
راستش خیلی از دوستان برنامه نویس نظرشون اینه که بهتره تاریخ به صورت میلادی ذخیره شه... تو تاپیکای اینجام که سرچ کردم به این نتیجه رسیدم..
و چون من اولین باره که برنامه نویسی میکنم ترجیح دادم از تجربه دیگران استفاده کنم...
نطر شما چیه؟؟؟ یا ذخیره به صورت شمسی و تو فیلد char تو مقایسه ها برای گزارشش گیری دچار مشکل نمیشم؟؟??

ali_habibi1384
پنج شنبه 02 شهریور 1391, 07:56 صبح
راستش خیلی از دوستان برنامه نویس نظرشون اینه که بهتره تاریخ به صورت میلادی ذخیره شه... تو تاپیکای اینجام که سرچ کردم به این نتیجه رسیدم..
و چون من اولین باره که برنامه نویسی میکنم ترجیح دادم از تجربه دیگران استفاده کنم...
نطر شما چیه؟؟؟ یا ذخیره به صورت شمسی و تو فیلد char تو مقایسه ها برای گزارشش گیری دچار مشکل نمیشم؟؟??
از char(10) استفاده كنيد مشكلي پيش نمياد.

hakim22
پنج شنبه 02 شهریور 1391, 09:21 صبح
با سلام

مشکل استفاده از DateTime در SQL این است که تاریخ های شمسی با 1300 شروع میشوند که در رنج و محدوده ی نوع متغیرهای DateTime نیست. و از سال 1700 شروع میشود .
در نسخه ی 2008 شما با انتخاب نوع متغیر DateTime2 می توانید به راحتی تاریخ های شمسی رو هم درون دیتابیس ذخیره کنید و این خیلی بهتر از حالت Char است.

محدوده ی Datetime2 :

0001-01-01 through 9999-12-31
January 1,1 AD through December 31, 9999 AD

با این روش دیگه نیاز نیست تاریخ رکوردها رو به صورت میلادی درون دیتابیس ذخیره کنید و بعد هنگام نمایش اونها رو به شمسی تبدیل کنید.
دلیل اینکه توصیه میشه از تاریخ های میلادی استفاده بشه کاملا سلیقه ایه. و بیشتر برمیگرده به اینکه خیلی از برنامه نویس ها ترجیه میدهند از نوع متغیر Datetime بجای Char استفاده کنند.

با توجه به اینکه در دات نت تقویم فارسی هست ( حتی تقویم های چینی ، تایلندی و ... هم هست ) هیچ مشکلی در هیچ زمانی برای تبدیل تاریخ های میلادی به شمسی وجود نداره.
از Globalization استفاده کنید و با PersianCalendar دی 2 خط کد تبدیل رو انجام بدید و میتوانید مطمئن باشید مایکروسافت کارشو درست انجام داده برای دیدن نمونه به اینجا سر بزنید :

http://msdn.microsoft.com/en-us/library/system.globalization.persiancalendar.getyear.aspx

پیشنهاد من اینه که شما تاریخ ها رو مستقیما به صورت شمسی به دیتابیس منتقل کنید و بیخیال تبدیل کردن بشید. چون هیچ نیازی برای اینکار وجود نداره و یک روش کاملا استاندارد برای اینکار وجود داره.

nafisehk
پنج شنبه 02 شهریور 1391, 20:42 عصر
از char(10) استفاده كنيد مشكلي پيش نمياد.


یعنی سه راحتی متونم query بگیرم؟؟؟
بین دو تا تاریخ؟
تو 1 سال خاص؟مثلا نامه های ثبت شده تو سال 90؟

nafisehk
پنج شنبه 02 شهریور 1391, 20:44 عصر
با سلام

مشکل استفاده از DateTime در SQL این است که تاریخ های شمسی با 1300 شروع میشوند که در رنج و محدوده ی نوع متغیرهای DateTime نیست. و از سال 1700 شروع میشود .
در نسخه ی 2008 شما با انتخاب نوع متغیر DateTime2 می توانید به راحتی تاریخ های شمسی رو هم درون دیتابیس ذخیره کنید و این خیلی بهتر از حالت Char است.

محدوده ی Datetime2 :

0001-01-01 through 9999-12-31
January 1,1 AD through December 31, 9999 AD

با این روش دیگه نیاز نیست تاریخ رکوردها رو به صورت میلادی درون دیتابیس ذخیره کنید و بعد هنگام نمایش اونها رو به شمسی تبدیل کنید.
دلیل اینکه توصیه میشه از تاریخ های میلادی استفاده بشه کاملا سلیقه ایه. و بیشتر برمیگرده به اینکه خیلی از برنامه نویس ها ترجیه میدهند از نوع متغیر Datetime بجای Char استفاده کنند.

با توجه به اینکه در دات نت تقویم فارسی هست ( حتی تقویم های چینی ، تایلندی و ... هم هست ) هیچ مشکلی در هیچ زمانی برای تبدیل تاریخ های میلادی به شمسی وجود نداره.
از Globalization استفاده کنید و با PersianCalendar دی 2 خط کد تبدیل رو انجام بدید و میتوانید مطمئن باشید مایکروسافت کارشو درست انجام داده برای دیدن نمونه به اینجا سر بزنید :

http://msdn.microsoft.com/en-us/library/system.globalization.persiancalendar.getyear.aspx

پیشنهاد من اینه که شما تاریخ ها رو مستقیما به صورت شمسی به دیتابیس منتقل کنید و بیخیال تبدیل کردن بشید. چون هیچ نیازی برای اینکار وجود نداره و یک روش کاملا استاندارد برای اینکار وجود داره.



مرسی دوست خوبم

اما من پروژم تو مراحل پایانیه و من با sql2005 کار کردم دیگه نمیتونم تغییرش بدم:ناراحت:

nafisehk
پنج شنبه 02 شهریور 1391, 20:47 عصر
نحوه ی درج کردن اطلاعاتت رو بگو تا برات کد تاریخ شمسی رو بزارم.

ممنونم اقای اجسان .گفتم من کد شمسی و دارم... فقط نمیدونم چه جوری 1 ستون و که میلادیه شمیسی کنم....مثل اینکه باید نوع داده رو به رشته تغییر بدم.............وای که چقد تلاش کردم و جقد کد نوشتم:قهقهه:

nafisehk
جمعه 03 شهریور 1391, 17:32 عصر
دوستان لطفا بگید که اگه تاریخ و به صورت شمسی توchar(10) ذخیره کنم میتونم تو به بازه ی تاریخی یا از 1 ماه خاص یا سال خاص query بگیرم؟؟؟

Y_Safaiee
جمعه 03 شهریور 1391, 17:40 عصر
با سلام خدمت شما

آره میشه میتونی مثلا دستور selecto اینطوری بنویسی :

برای یک ماه خاص :


select * from kala where tsabt='1391/05/03'


برای مابین چند ماه / روز :


select * from kala where tsabt>='1391/01/05' and tsabt<='1391/05/03'


از تکس باکس گرفتن:


select * from kala where tsabt>='" + textBox1.text + "' and tsabt<='" + textBox2.text + "'"

از between هم میتونی استفاده کنی.

موفق باشی
بایت بایت

nafisehk
جمعه 03 شهریور 1391, 17:49 عصر
با سلام خدمت شما

آره میشه میتونی مثلا دستور selecto اینطوری بنویسی :

برای یک ماه خاص :


select * from kala where tsabt='1391/05/03'


برای مابین چند ماه / روز :


select * from kala where tsabt>='1391/01/05' and tsabt<='1391/05/03'


از تکس باکس گرفتن:


select * from kala where tsabt>='" + textBox1.text + "' and tsabt<='" + textBox2.text + "'"

از between هم میتونی استفاده کنی.

موفق باشی
بایت بایت



پس ذخیره تاریخ تو datetime به صورت میلادی مزیتش فقط اینه که برای ذخیره از نوع خودش استفاده میش؟؟؟ یعنی فقط تخصصی تره؟؟

faravaghi
جمعه 03 شهریور 1391, 23:11 عصر
سلام،
شما میتونید یه حلقه بزارین و در اون تمام فیلد های تاریخ رو به شمسی تبدیل کنید:



using FarsiLibrary.Utils;
using System.Globalization;
if (Dgv.Rows.Count > 0)
for (int i = 0; i < Dgv.Rows.Count; i++)
{
Dgv.Rows[i].Cells["farsiDate"].Value = ((PersianDate)Convert.ToDateTime(Dgv.Rows[i].Cells["GregorianDate"].Value)).ToString("g");
}


farsiDate : سلولیه که تاریخ شمسی توی اون نمایش داده میشه.
GregorianDate : تاریخ میلادی که به صورت مخفی است.

WgsFahime
دوشنبه 20 شهریور 1391, 08:52 صبح
با سلام
دوست من این کار بسیار ساده است
شما باید یک تابع را در گرید فراخوانی کنی


<asp:TemplateField HeaderText="تاریخ خبر" SortExpression="New_Date" Visible="False">
<ItemTemplate>
<div dir="ltr" align="right">
<%# PersianDateTime(Eval("New_Date")) %>
</div>
</ItemTemplate>

حالا این تابع را این طوری در بیهاند بنویس

public static string PersianDateTime(object inputDate)
{
if (inputDate != null)
{
DateTime InputDate = Convert.ToDateTime(inputDate);

return string.Format("{0}", Persia.Calendar.ConvertToPersian(InputDate).Weekda y, PersianTime(InputDate));


}
else
{

return "";
}
}

WgsFahime
دوشنبه 20 شهریور 1391, 09:02 صبح
سلام دوست من . به نظرمن تاریخ را رشته ای تعریف نکن چون بعد به درد سر می افتی

roolinjax
دوشنبه 20 شهریور 1391, 19:32 عصر
سلام
منم با نظر wgsfahime موافقم. چون خودم توی پروژه ای از نوع تاریخ زمان گذاشتم و وسط کار برای بعضی عملیات به این نتیجه رسیدم که اگر تاریخ و زمان نبود جواب نمیداد.
در ضمن شما اگر بخوای از نوع char(10) بذاری کنترل صحت ورود داده به گردن شماست ، در حالی که توی نوع DateTime به سادگی می تونی با یه خط کد تابع IsDate رو هم پیاده کنی و از معتبر بودن تاریخ هم خیالت راحت بشه.
دلیل دیگه استفاده از تاریخ میلادی برای پیدا کردن اختلاف بین دو تاریخه که در مورد شمسی اصلا جواب نمیده.
چون به عنوان مثال سال میلادی در ماه دوم 28 روزه در حالی که شمسی 31 روزه است و در مورد اختلاف تاریخ به مشکل خواهید خورد.

پس دوستان عزیز خشت اول را با تاریخ میلادی بگذارید تا بعدا به مشکل نخورید .
تبدیلش به شمسی هم کاری نداره . چه توی برنامه ، چه کریستال ریپورت و چه هر جای دیگه از برنامه
موفق باشید.

samadblaj
دوشنبه 20 شهریور 1391, 20:31 عصر
با سلام

مشکل استفاده از DateTime در SQL این است که تاریخ های شمسی با 1300 شروع میشوند که در رنج و محدوده ی نوع متغیرهای DateTime نیست. و از سال 1700 شروع میشود .
در نسخه ی 2008 شما با انتخاب نوع متغیر DateTime2 می توانید به راحتی تاریخ های شمسی رو هم درون دیتابیس ذخیره کنید و این خیلی بهتر از حالت Char است.

محدوده ی Datetime2 :

0001-01-01 through 9999-12-31
January 1,1 AD through December 31, 9999 AD

با این روش دیگه نیاز نیست تاریخ رکوردها رو به صورت میلادی درون دیتابیس ذخیره کنید و بعد هنگام نمایش اونها رو به شمسی تبدیل کنید.
دلیل اینکه توصیه میشه از تاریخ های میلادی استفاده بشه کاملا سلیقه ایه. و بیشتر برمیگرده به اینکه خیلی از برنامه نویس ها ترجیه میدهند از نوع متغیر Datetime بجای Char استفاده کنند.

با توجه به اینکه در دات نت تقویم فارسی هست ( حتی تقویم های چینی ، تایلندی و ... هم هست ) هیچ مشکلی در هیچ زمانی برای تبدیل تاریخ های میلادی به شمسی وجود نداره.
از Globalization استفاده کنید و با PersianCalendar دی 2 خط کد تبدیل رو انجام بدید و میتوانید مطمئن باشید مایکروسافت کارشو درست انجام داده برای دیدن نمونه به اینجا سر بزنید :

http://msdn.microsoft.com/en-us/library/system.globalization.persiancalendar.getyear.aspx

پیشنهاد من اینه که شما تاریخ ها رو مستقیما به صورت شمسی به دیتابیس منتقل کنید و بیخیال تبدیل کردن بشید. چون هیچ نیازی برای اینکار وجود نداره و یک روش کاملا استاندارد برای اینکار وجود داره.

این روشی که دوست عزیزمون hakim22 فرمودند خیلی بهتر از روش های تغییر به میلادی و شمسی هستش و دردسر و سردرگمی کمتری داره.
از امرو من دیگه از این نوع تاریخ استفاده میکنم.

samadblaj
سه شنبه 21 شهریور 1391, 13:13 عصر
ببخشید این روشی که دوستمون گفتن استفاده از datetime 2 روش بسیار خوبی است.
طبق عکس زیر چطور میتونم وقتی روی دکمه کلیک شد دو تاریخ از هم کم شه اصلا فکر کنید این دو تاریخ توی یک دو تا textbox هست چجور باید از هم کم شن. اون کدهایی که آقای حبیبی توی صفحه اول قرار دادن خیلی مشکل بود ، یه روش میخوام مثل کد زیر.

DateTime myDateTime = DateTime.Parse("01/11/1390 23:10:30");

TimeSpan myTimeSpan = new TimeSpan(0, 1, 2, 4);

DateTime myDateTime8 = myDateTime - myTimeSpan;

Console.WriteLine("myDateTime - myTimeSpan = " + myDateTime8);

Console.ReadKey();

با تشکر

roolinjax
سه شنبه 21 شهریور 1391, 16:44 عصر
سلام
آقای samadblaj میشه توی این روشی که شما استفاده می کنی مقدار تاریخ " 1391/02/31 " رو وارد کنید و ببینید که جواب میده یا نه ؟
اگر مشکلی نداشت و از طرفی تونستید اختلاف بین دو تاریخ رو توی روش خودتون با یک خط کد بنویسید حتما به من هم بگید .
گرچه جواب رو از همین الان میدونم که جواب چیه !!! :چشمک:
اختلاف تاریخ که اصلا جواب درستی نخواهد داد .
خودتون رو برای برخورد با مشکلات مختلف روشتون آماده کنید !!!!
موفق باشید

samadblaj
سه شنبه 21 شهریور 1391, 17:27 عصر
سلام
آقای samadblaj میشه توی این روشی که شما استفاده می کنی مقدار تاریخ " 1391/02/31 " رو وارد کنید و ببینید که جواب میده یا نه ؟
اگر مشکلی نداشت و از طرفی تونستید اختلاف بین دو تاریخ رو توی روش خودتون با یک خط کد بنویسید حتما به من هم بگید .
گرچه جواب رو از همین الان میدونم که جواب چیه !!!
اختلاف تاریخ که اصلا جواب درستی نخواهد داد .
خودتون رو برای برخورد با مشکلات مختلف روشتون آماده کنید !!!!
موفق باشید

سلام رولی جان این روشی که من استفاده کردم از datetime2 استفاده کردم که راحت جواب داد و فرمت رو پذیرفت عکسی رو که مشاهده میکنید هیچ converti نشده و توسط کاربر به صورت شمسی توی فیلد جدول ذخیره شد و به سادگی هم نمایش داد.

DateTime myDateTime = DateTime.Parse("01/11/1390 23:10:30");

TimeSpan myTimeSpan = new TimeSpan(0, 1, 2, 4);

DateTime myDateTime8 = myDateTime - myTimeSpan;

Console.WriteLine("myDateTime - myTimeSpan = " + myDateTime8);

Console.ReadKey();

این کد هم جواب میده روی فرمت یعنی اختلاف رو از این نوع فرمت بدست اورد.
پس مشکلی با مقایسه ها نداره.

فقط تنها مشکلی که دارم میخوام جای خط پایین یه تاریخ وارد کنم و بهم اختلاف رو نمایش بده ولی timespan اختلاف رو بر حسب ساعت نمایش میده (که دردسر داره یه روز رو تبدیل کنیم.)
TimeSpan myTimeSpan = new TimeSpan(0, 1, 2, 4);

این نوع تاریخ خیلی مناسب و کارامده . شما مشکلتون چیه وقتی راحت میشه ذخیره کرد راحت توسط TimeSpan اختلاف رو بدست آورد پس مشکل کجاست؟

FastCode
سه شنبه 21 شهریور 1391, 17:46 عصر
توابع تاریخ
http://barnamenevis.org/showthread.php?64210-%D9%86%D9%85%D9%88%D9%86%D9%87-%D8%A8%D8%B1%D9%86%D8%A7%D9%85%D9%87-%D9%87%D8%A7%DB%8C-%DA%A9%D9%88%DA%86%DA%A9-%D9%88-%D9%85%D9%81%D9%8A%D8%AF-%D8%AF%D8%B1-%D8%B3%D9%8A-%D8%B4%D8%A7%D8%B1%D9%BE&p=1591589&viewfull=1#post1591589
این متودها فقط با تاریخ شمسی کار میکنن و برای دیتابیس هایی هستن که تاریخ شمسی رو ذخیره میکنن.

سرعت این روش فوق العاده بیشتر از ذخیره کردن ه تاریخ ه میلادی و تبدیل به شمسیه

EDIT:
روش سریعتر استفاده از یک smallint هست با دقت بالا و 127 سال اعتبار که فکر نکنم کسی اینجا بهش علاقه داشته باشه
struct SmallDate {
short Value;
int GetDay() { return Value & 0x31; }
int GetMonth() { return (Value >> 5) & 0x15; }
int GetYear() { return Value >> 9; }
}

roolinjax
سه شنبه 21 شهریور 1391, 17:47 عصر
اولا من وب رو نگفتم ، چون اصلا زمینه ی کارم نیست و اطلاعاتی هم ندارم ازش
دوما کجای این چیزی که نوشتی dateTime2 هستش ؟
من که فرقی نمی بینم
از طرفی چیزی که گفتم رو تست کردین ؟
می دونم که اشتباهه
چون تاریخ شمسی در کار نیست ، بلکه فقط سال میلادی رو عقب می کشه
پس روز های ماه های میلادی و سال کبیسه بر حسب میلادی خواهد بود.
تلاش نکن که محصول مایکروسافت رو ایرانی نشون بدی !!!!! بهش نمیاد!!!!!

samadblaj
سه شنبه 21 شهریور 1391, 18:17 عصر
اولا من وب رو نگفتم ، چون اصلا زمینه ی کارم نیست و اطلاعاتی هم ندارم ازش
دوما کجای این چیزی که نوشتی dateTime2 هستش ؟
من که فرقی نمی بینم
از طرفی چیزی که گفتم رو تست کردین ؟
می دونم که اشتباهه
چون تاریخ شمسی در کار نیست ، بلکه فقط سال میلادی رو عقب می کشه
پس روز های ماه های میلادی و سال کبیسه بر حسب میلادی خواهد بود.
تلاش نکن که محصول مایکروسافت رو ایرانی نشون بدی !!!!! بهش نمیاد!!!!!

دوست عزیز شما انگاری اطلاع ندارید.
ببینید تاریخ datetime سری اول اگه اشتب نکنم از 1700 شروع میشد که ما نیاز به حدود 1200 داریم اگر ضرفیت datetime سری اول پایین بود همه ی ما ازش استفاده میکریم و نیازی نبود که از nvarchar و از این قبیل استفاده کنیم. و نکته دوم این تاریخ رو عقب نمیکشه !!! شما وقتی برای برنامه تون میزارید فاکتور سال 1390 رو میخوام این گزارش فقط فقط با تاریخ برنامه شما ست میشه نا با تاریخ سیستم.
من از nvarchar استفاده کردم اما این نوع تاریخ عالیه. و در بدترین حالت هم هیچ مشکلی برای شما وجود نمیاد (مثل bigint نسبت به int).

و نکته آخر مایکرو سافت و ایرانی ! نه عزیزم فقط زبان ما فارسی نیست این برای کشور های دیگه خاورمیانه از قبیل تاجیکستان ، افغانستان و فکر کنم پاکستان هم هست برای ایناست. و اگر نه اگه فقط زبان ما پارسی بود خبری هم از PersianCalender نبود.

موفق باشید

roolinjax
سه شنبه 21 شهریور 1391, 18:25 عصر
خوب روش تعریف این متغیر چه شکلیه ؟
و توی کدوم نسخه از ویژوال استودیو وجود داره ؟

samadblaj
سه شنبه 21 شهریور 1391, 18:42 عصر
آهان الان شد.
سی شارپی که من استفاده میکنم نسخه 2010 ست. SQL SERVER نصب ندارم ولی از دیتای SQL Express نوع تاریخت رو datetime2(7) انتخاب کن.
بعد توی فرمت یه فیلد بزار برای تاریخت (مثلا اینو توش وارد کن 1390/5/8) دکمه هم برای ذخیره به سادگی ذخیره میشه (ولی توی سایر تاریخ ها که دو نوع دیگه هستن نتونستم این تاریخ 1390/5/8 رو ذخیره کنم فقط تاریخ نوع 2 شد) ! و باکدی که گذاشتم راحت میتونی روش انجام عملات داشته باشی مثلا با TimeSpan به سادگی میتونی از تاریخ خروجی بدست بیاری دیگه نیازی به برگردوندن به میلادی و ذخیره به میلادی هم نیست.

موفق باشید

roolinjax
سه شنبه 21 شهریور 1391, 19:06 عصر
چه ربطی داره به اس کیو ال ؟
من حرفم روی ویژوال استودیوست
DateTime dt=new DateTime();
dt=DateTime.Parse("1390/02/31");
آیا این خط ارور نمیده ؟
چرا من از فرحزاد می گم شما از جوادیه ؟

samadblaj
سه شنبه 21 شهریور 1391, 19:17 عصر
خوب مشکل شما چیه مگه شما نمیخواید یه برنامه بنویسید که تاریخ شمسی رو هم پشتیبانی کنه ؟؟ اگه اینطوره بهترین روش استفاده از این نوع توی دیتابس و راحتی کار توی انجام عملیات توی سی شارپ هستش.
حالا من میگم نره تو بگو بدوش...
روز خوش./

roolinjax
سه شنبه 21 شهریور 1391, 19:19 عصر
مشکل شما هم مثل من اینه که به دانسته های خود اتکا کردین و حتی حاضر نیستین دو خط کد منو کپی کنین و ببینین چه اتفاقی می افته.

samadblaj
سه شنبه 21 شهریور 1391, 21:53 عصر
مشکل شما هم مثل من اینه که به دانسته های خود اتکا کردین و حتی حاضر نیستین دو خط کد منو کپی کنین و ببینین چه اتفاقی می افته.
اینطور نیست ، ببخشید میشه بگید خودتون به چه شکل از زمان توی برنامتون استفاده میکنید؟

FastCode
چهارشنبه 22 شهریور 1391, 00:06 صبح
من کلاً نمیفهمم اسرار بر استفاده از توابع و انواع تاریخ میلادی چیه؟مگه اینجا آمریکاست؟
چه لزومی داره که با وجود توابعی که فقط با اطلاعات شمسی کار میکنند از تاریخ میلادی استفاده بشه؟

roolinjax
چهارشنبه 22 شهریور 1391, 09:37 صبح
آهان الان شد.
سی شارپی که من استفاده میکنم نسخه 2010 ست. SQL SERVER نصب ندارم ولی از دیتای SQL Express نوع تاریخت رو datetime2(7) انتخاب کن.
بعد توی فرمت یه فیلد بزار برای تاریخت (مثلا اینو توش وارد کن 1390/5/8) دکمه هم برای ذخیره به سادگی ذخیره میشه (ولی توی سایر تاریخ ها که دو نوع دیگه هستن نتونستم این تاریخ 1390/5/8 رو ذخیره کنم فقط تاریخ نوع 2 شد) ! و باکدی که گذاشتم راحت میتونی روش انجام عملات داشته باشی مثلا با TimeSpan به سادگی میتونی از تاریخ خروجی بدست بیاری دیگه نیازی به برگردوندن به میلادی و ذخیره به میلادی هم نیست.

موفق باشید
با سلام
میشه یه مثال کامل کد از TimeSpan برام بذارین ؟ چطوری از تاریخ خروجی بدست میاره ؟ و دیگه به چه دردی می خوره ؟
گرچه می دونم جواب این پست رو نخواهید داد ولی بدونید که من خیلی راغبم که بدونم چطوری از این کلاس استفاده می کنید .

samadblaj
چهارشنبه 22 شهریور 1391, 13:12 عصر
با سلام
میشه یه مثال کامل کد از TimeSpan برام بذارین ؟ چطوری از تاریخ خروجی بدست میاره ؟ و دیگه به چه دردی می خوره ؟
گرچه می دونم جواب این پست رو نخواهید داد ولی بدونید که من خیلی راغبم که بدونم چطوری از این کلاس استفاده می کنید .

شمام آدمو گردن بار میکنید !!! :قهقهه:
نه عزیزم مشکل من از قبل حل شده بود فقط دنبال راه ساده تر بودم این شمایید که با بدبینیتون به این متد ها مشکل دارید.

شما اگه مشکلی با برنامه نویسی نداشتید میفهمیدید این چند خط کد چیکار میکنه ، نیازی نیست یه consol app کافیه بسازید (توضیح بدم چجور بسازید؟).
یک شبانه روز 24 ساعت 2 شبانه 48 زمان رو کم کن.

من دیگه نظری ندارم و همینطور اطلاعاتم هم در سطح بحث کردن در رابطه با این موضوع و شما نیست.

فقط اگه میگفتید روش خودتون به چه شکله ، که...

موفق باشید./


DateTime myDateTime = DateTime.Parse("01/11/1390 23:10:30");

TimeSpan myTimeSpan = new TimeSpan(0, 1, 2, 4);

DateTime myDateTime8 = myDateTime - myTimeSpan;

Console.WriteLine("myDateTime - myTimeSpan = " + myDateTime8);

Console.ReadKey();

roolinjax
چهارشنبه 22 شهریور 1391, 14:10 عصر
شمام آدمو گردن بار میکنید !!! :قهقهه:
نه عزیزم مشکل من از قبل حل شده بود فقط دنبال راه ساده تر بودم این شمایید که با بدبینیتون به این متد ها مشکل دارید.

شما اگه مشکلی با برنامه نویسی نداشتید میفهمیدید این چند خط کد چیکار میکنه ، نیازی نیست یه consol app کافیه بسازید (توضیح بدم چجور بسازید؟).
یک شبانه روز 24 ساعت 2 شبانه 48 زمان رو کم کن.

من دیگه نظری ندارم و همینطور اطلاعاتم هم در سطح بحث کردن در رابطه با این موضوع و شما نیست.

فقط اگه میگفتید روش خودتون به چه شکله ، که...

موفق باشید./

همچین گفتین TimeSpan فک کردم می خواید چه کار خارق العاده ای انجام بدید.
این کد شما هم که جواب نمیده !!!!! شکلک خنده !!!!
وقتی به حرف دقت نمی کنید همینه دیگه
توی خط اول من می خوام تاریخ 31 اردیبهشت رو وارد کنم ، شما راهنماییم کنید (شاید از کم صوادی منه که نمی تونم وارد کنم) میشه این خط رو برام بنویسید طوری که ارور نده ؟
در ضمن من از روشی که شما قبول ندارین استفاده می کنم (ثبت بصورت میلادی و نهایتا تبدیل به شمسی موقع نمایش)
منتظر جوابم ، البته اگر جوابی باشه !!!!

kkkaka
چهارشنبه 22 شهریور 1391, 14:15 عصر
سلام به همه
اولآ خدمت دوستای گل خودم عرض کنم
بنده تقریبآ کمتر از 3 ماهه که دارم بصورت مداوم تو این سایت فعالیت میکنم و به نظرم پر بار ترین سایت علمی همین سایته(به لطف کاربرای بسیار خوبی که داره)
با توجه به نوع مباحث این سایت که اکثرآ علمی هست و دوستانی که در اون فعالیت میکنن که اونها نیز اکثرا از بچه های باسواد و تحصیل کرده جامعه هستند.
باید یکم رو ادبیات نوشتاری و نحوه خطاب یکدیگر حساس تر باشیم .
چه بهتر که ما اول به شخصیت هم احترام بذاریم بعد بار علمی خودمون رو رخ کش کنیم.
----------------------------------------------------------------------------------------------
بنده لقمه رو یه 100 دوری دور سرم چرخوندم (چون اون موقع علمشو نداشتم)
من تاریخ هارو Varchar10 و شمسی ذخیره کردم بعد یه تابع برای اختلاف بین دو تاریخ نوشتم!!
البته تا اینجا هیچ مشکلی باهاش نداشتم فقط سالهای کبیسه مونده که اونو در نظر نگرفته بودم البته تو برنامه ای که در حال حاظر دارم مینویسم سال کبیسه هیچ مشکلی ایجاد نمیکنه.

ehsan7007
چهارشنبه 22 شهریور 1391, 14:22 عصر
کاکا جون ، بحث چیزه دیگه ایه!

من کاری که roolinjax گفت رو کردم ، ارور میده!

roolinjax
چهارشنبه 22 شهریور 1391, 14:25 عصر
جناب کاکای عزیز ممنون از نظر لطفت
اما خوب شکلک خنده ای که دوستمون آقا صمد گذاشتن شاید برازنده ی این موقعیت نبوده.
هرکس روش کار خودشو داره
از اونجایی که تمام توابع و کلاس های نوشته شده برای تاریخ میلادی هستش پس استفاده از تاریخ شمسی اشتباه محضه.
ضمنا روش من سال کبیسه رو هم محاسبه می کنه.
در نهایت باید بگم که مشکل ما سر اس کیو ال نیست ، مشکل اینه که ویژوال استودیو و ودات نت با شمسی سازگاری نداره ، حالا باز آقا صمد عزیز که خیلی دوستش دارم و براش احترام قائلم بگه که DateTime2 استفاده کنم.
اون خط کدی که گفتم رو هرکی تست کنه متوجه عرایض من میشه.
از دوستانی که از حرفای من توی این تاپیک رنجیدن بالاخص جناب کاکای عزیز عذرخواهی می کنم.
موفق باشید

ehsan7007
چهارشنبه 22 شهریور 1391, 14:30 عصر
دوستان ، یه بار دیگه هم میگم که حق با roolinjax عزیزه!

این رو امتحان کنید تابفهمید :

DateTime myDateTime = DateTime.Parse("30/2/1391 23:10:30");

TimeSpan myTimeSpan = new TimeSpan(0, 1, 2, 4);

DateTime myDateTime8 = myDateTime - myTimeSpan;

MessageBox.Show("myDateTime - myTimeSpan = " + myDateTime8);

ehsan7007
چهارشنبه 22 شهریور 1391, 14:36 عصر
اگه بخوای همچین تاریخی رو نمایش بدی این ارور رو میدی :

String was not recognized as a valid DateTime.

FastCode
چهارشنبه 22 شهریور 1391, 16:11 عصر
من تا حالا مشکلی با ذخیره کردن شمسی نداشتم.نمیدونم چرا دوستان اینقدر مشکل دارن؟
اگر ممکنه توضیح بدید چه کاری میخواهید بکنید که نیاز به DateTime داره؟
اون توابعی که من گزاشتم همه ی عملیات ه ممکن با تاریخ شمسی رو انجام میده.

samadblaj
چهارشنبه 22 شهریور 1391, 18:30 عصر
سلام ، دوستان همگی ببخشید اگه لحن صحبت کردنمون یه کم نا مناسب بود ، قصد جسارت به کسی رو نداشتم.عزیزم اون شکلک خنده هم بی مورد بود و توین به کسی نبود اگه دویاره مطالعه کنید متوجه خواهید شد بر میگرده به خودم اگه کسی هم ناراحت شد ازش معذرت خواهی مینم.



همچین گفتین TimeSpan فک کردم می خواید چه کار خارق العاده ای انجام بدید.
این کد شما هم که جواب نمیده !!!!! شکلک خنده !!!!
وقتی به حرف دقت نمی کنید همینه دیگه
توی خط اول من می خوام تاریخ 31 اردیبهشت رو وارد کنم ، شما راهنماییم کنید (شاید از کم صوادی منه که نمی تونم وارد کنم) میشه این خط رو برام بنویسید طوری که ارور نده ؟
در ضمن من از روشی که شما قبول ندارین استفاده می کنم (ثبت بصورت میلادی و نهایتا تبدیل به شمسی موقع نمایش)
منتظر جوابم ، البته اگر جوابی باشه !!!!

رولی عزیز ببین گفتم ، میگم این کار جواب میده شما تاریخ رو از کاربر (textbox) میگیرید توی دیتابیس به صورت مستقیم ذخیره میکنید از نوع datetime 2 این تاریخ .
موقع کم کردن تاریخ با هر مقایسه ای دیگه ای هم Substring از هم ماه /روز/سال رو جدا میکنید هر کدوم نیاز بود با تکیه کد زیر به سادگی بدست میارید دوست داشتید قالب رو تغییر میدید نیازی نبود دوباره مستقیم ذخیره کنید به راحتی هم ازش میشه توی گزارشامون ازش کوری گرفت چون استاندارد است.


DateTime myDateTime = DateTime.Parse("1391/5/10");

TimeSpan myTimeSpan = new TimeSpan(2, 0, 0, 0);

DateTime myDateTime8 = myDateTime - myTimeSpan;

MessageBox.Show( myDateTime8 .ToString ());



دوستان ، یه بار دیگه هم میگم که حق با roolinjax عزیزه!

این رو امتحان کنید تابفهمید :


اگه بخوای همچین تاریخی رو نمایش بدی این ارور رو میدی :

احسان جون ممنونم از کنجکاویتون سینتکس یه messagebox هم اینجور وارد کنید خطا میده ، لطفا پیگیری کنید تا...

DateTime myDateTime = DateTime.Parse("1391/5/10");

TimeSpan myTimeSpan = new TimeSpan(2, 0, 0, 0);

DateTime myDateTime8 = myDateTime - myTimeSpan;

MessageBox.Show( myDateTime8 .ToString ());

کاکای عزیز شما هم ببخشید.
همینطور کد های fastcode عزیز توی تاپیک برنامه های مفید تمامی معادلاتی محاسباتی ... رو شامل میشه.

موفق باشید./

ehsan7007
چهارشنبه 22 شهریور 1391, 20:52 عصر
صمد جان ، تو اصلن چیزی رو که من گفتم امتحان کردی؟
ببین از این تاریخ هم می تونی استفاده کنی؟ :
1391/2/30

samadblaj
چهارشنبه 22 شهریور 1391, 21:05 عصر
صمد جان ، تو اصلن چیزی رو که من گفتم امتحان کردی؟
ببین از این تاریخ هم می تونی استفاده کنی؟ :
1391/2/30

عزیزه من ، جان من ،تو برنامه نویسی تو داری مستقیم از تاریخ شمسی به این شکل استفاده میکنید.
یعنی شما نباید یه شگرد در برنامه نویسی به خرج بدید !
نمیتونی از maskedtextbox استفاده کنی؟
نمی تونی از substring , split استفاده کنید.
نمیتونی تاریخ رو به صورت روز / ماه / سال بزاری توی سه کامبو جدا در کنار هم و از کاربر بگیری؟

ehsan7007
چهارشنبه 22 شهریور 1391, 21:21 عصر
آه خدا، صمد جان ، چرا اصلا سعی نمی کنی یکم بفهمی ما چی میگیم!



عزیزه من ، جان من ،تو برنامه نویسی تو داری مستقیم از تاریخ شمسی به این شکل استفاده میکنید.
یعنی شما نباید یه شگرد در برنامه نویسی به خرج بدید !
نمیتونی از maskedtextbox استفاده کنی؟
نمی تونی از substring , split استفاده کنید.
نمیتونی تاریخ رو به صورت روز / ماه / سال بزاری توی سه کامبو جدا در کنار هم و از کاربر بگیری؟

اصلا ربطش چیه؟ من چی میگم ، تو میای و چی میگی!!!
اقا اصلا من معذرت می خوام ، من تو برنامه نویسی هیچی سرم نمی شه ، من ناوارد ، من .. .
دیگه حوصله ندارم دوباره توضیح بدم و این مسئله هی کش پیدا کنه ، تمامی مشکلات از طرف من بود و از شما مستقیما عذر خواهی می کنم.

شما راست میگی ، همه ی حرف های شما درسته ، من رو ببخشید اخه من هیچی نمی دونم.

samadblaj
پنج شنبه 23 شهریور 1391, 11:31 صبح
آه خدا، صمد جان ، چرا اصلا سعی نمی کنی یکم بفهمی ما چی میگیم!
اصلا ربطش چیه؟ من چی میگم ، تو میای و چی میگی!!!
اقا اصلا من معذرت می خوام ، من تو برنامه نویسی هیچی سرم نمی شه ، من ناوارد ، من .. .
دیگه حوصله ندارم دوباره توضیح بدم و این مسئله هی کش پیدا کنه ، تمامی مشکلات از طرف من بود و از شما مستقیما عذر خواهی می کنم.

شما راست میگی ، همه ی حرف های شما درسته ، من رو ببخشید اخه من هیچی نمی دونم.

تو واسه چی به خودت میگیری ، اصلا کسی با تو صحبت نکرد تو اومدی پست روی پست من زدی منم جواب دادم.
اینجا بحث من فقط با رولینجاکس بود و یه بحث ساده و با این بحث هاست که میشه رفت جلو. نزدیک به 6 ساله طراحی سه بعدی و برنامه نویسی میکنم مثل شما خسته نشدم آدمی که میاد سراغ برنامه نویسی باید بیشتر از اینا حوصله به خرج بده (اینا در باب احسان عزیز بود الان بچه ها نریزن رو سرم) .

fastcode توی یکی از پست هاش گفت من این مسئله رو به چند روش حل میکنم ، پس هر کسی مثل رولی یا من روش خاص خودمون رو داریم اصل اینجاست که جواب بگیریم.

و اگه از پست اول من مطالعه میکردید که من سوال کردم چجور تو تاریخ رو از هم کم کنیم و من با این روش به نتیجه رسیدم به اینجا نمی کشید.

بارها توی تایک ها دوستان اشاره کردن اگه تاریخ میلادی ظرفیتی بیشتر داشت با مشکل بر نمی خوردیم

تن همگی سلامت رفتنی ها که میرن...

موفق باشید./

hakim22
دوشنبه 27 شهریور 1391, 18:36 عصر
بعد از کلی خوش و بش کردن خوبه که بریم سر اصل مطلب !

اول باید بگم که dateTime2 یکی از انواع متغیرها در SQL server است و ربطی به VS نداره
کلا SQL server برای اینکه خطای ذخیره سازی اطلاعات رو پایین بیاره برای DateTime یک محدوده تعیین کرده و در حالت DateTime2 این محدودیت ها رو برداشته

در مورد DateTime در دات نت و اون هم در CS باید بگم که اگر به نوع متغیرهای ورودی این متد دقت کنید همه ی پارامترهای عددی از نوع Int32 هستند.
یعنی برای ساعت ، سال ، دقیقه ، ثانیه و ... اعداد از نوع Int32 ( و در همون محدوده ) میشه وارد کرد.
پس هیچ محدودیتی در رنج سالهای شمسی (و هر نوع سال دیگری !) در این متغیر وجود ندارد.

کد زیر را امتحان کنید :

DateTime myDateTime = DateTime.Parse("1391/5/10 23:45:00");

TimeSpan myTimeSpan = new TimeSpan(0, 1, 2, 4);

DateTime myDateTime8 = myDateTime - myTimeSpan;

MessageBox.Show("myDateTime - myTimeSpan = " + myDateTime8);


دقت کنید که در مورد حالتی که قرار است از String استفاده کنید همیشه ماه باید در وسط قرار گرفته باشد.
همینطور برای ساعت دقیقه همیشه در وسط درج میشود
همیشه ممکن است در نوشتن عبارت تاریخ به صورت رشته ای خطایی صورت گرفته باشد . در این موارد parse قادر به بازسازی تاریخ نیست.
یکی از دلایلی که از اول برای حذف استفاده از Char و String در تعیین تاریخ ذکر شد هم همین است.

1- همیشه در VS از تاریخ شمسی استفاده کنید
2- هنگام کار با SQL server از متغیر نوع Datetime2 استفاده کنید
3- برای تبدیل تاریخ های میلادی به شمسی و برعکس از PersianCalendar که در زیر فضای نامی Globalization است استفاده کنید.

و در اینجا مشکل کار با تاریخ های شمسی را یکبار و برای همیشه حل کردیم. !

ehsan7007
دوشنبه 27 شهریور 1391, 18:50 عصر
نه دوست عزیز ، حل نشد .
حالا شما هم این که کد خودته و فقط تارخش عوض شده رو امتحان کن و نتیجه رو بگو.
ولی خواهشن امتحان کن :

DateTime myDateTime = DateTime.Parse("1391/2/30 23:45:00");

TimeSpan myTimeSpan = new TimeSpan(0, 1, 2, 4);

DateTime myDateTime8 = myDateTime - myTimeSpan;

MessageBox.Show("myDateTime - myTimeSpan = " + myDateTime8);

FastCode
دوشنبه 27 شهریور 1391, 19:36 عصر
فوریه 1391 فقط 28 روز داره.خطا میده.

من همین کد رو با سیستم خودم مینویسم.
int MyDate = DF.DateToInt("1391/02/30") ?? 0;
int OtherDate = DF.DateToInt("1360/12/29") ?? 0;
TimeSpan Difference = new TimeSpan(MyDate - OtherDate, 0, 0, 0);
MessageBox.Show("The Difference is " + Difference.ToString());


int MyDate = DF.DateToInt("1391/02/30") ?? 0;
TimeSpan Difference = new TimeSpan(43, 0, 0, 0);
string OtherDate = DF.IntToDate(MyDate + TimeSpan.Days);
MessageBox.Show("The OtherDate is " + OtherDate.ToString());
خیلی سخت نیست.
تاریخ های Invalid رو با null نشون میده.
Licenseش BSD ه که همه بتونن استفاده کنن.
فوق العاده سریعه.
زمان نداره.
تاریخ رو به شکل نامحدود حساب میکنه و به ازای ساپورت هر سال فقط 4 بایت حافظه مصرف میکنه و تاثیری در سرعتش نداره.(پیشفرض از 1300 تا 1500)
فقط با int طرف هستید.

ehsan7007
دوشنبه 27 شهریور 1391, 19:49 عصر
خدا خیرت بده FastCode جان!
من که هرچی میگم این کاری که شما می کنید شمسی نیست و اینطوری نمیشه ، دوباره پست می زنن که این چهار خط تاریخ رو شمسی می کنه!
راستی صمد جان ! تو اردیبهشت منتظر خبرای خوش از اونایی که براش برنامه نوشتی باش!...

کسی هم به دل نگیره ، هر چی بود همه ببخشن دیگه! :تشویق:


FastCode جان! تو 19 سالته و 73 کیلویی؟؟؟!!!
خوش تیپی ها!

FastCode
دوشنبه 27 شهریور 1391, 20:04 عصر
دوباره پست می زنن که این چهار خط تاریخ رو شمسی می کنه!مشکل من دقیقاً همینه؟
شما چه چیزی از تاریخ شمسی میخوای که پیاده سازی نشده؟

این رو هم گوگل کن خوبه.
226899

این عدد توی اون کد نیست

و ۱۸۳ سانت

SuTeDell
یک شنبه 09 مهر 1391, 00:59 صبح
سلام دوست عزیز
من هم تو برنامم از تازیخ شمسی استفاده کردم.میخوام ی گزارش تهیه کنم که براساس یک بازه زمانی جستجو میکنه.اما چون در دیتابیس نوع تاریخ را nchar انتخاب کردم نمیشه در رشته ها از علامت > یا < استفاده کرد.
اگه میشه کمکم کنید.
ممنون

FastCode
یک شنبه 09 مهر 1391, 03:27 صبح
سلام دوست عزیز
من هم تو برنامم از تازیخ شمسی استفاده کردم.میخوام ی گزارش تهیه کنم که براساس یک بازه زمانی جستجو میکنه.اما چون در دیتابیس نوع تاریخ را nchar انتخاب کردم نمیشه در رشته ها از علامت > یا < استفاده کرد.
اگه میشه کمکم کنید.
ممنون
این تاپیک رو کامل خوندید و به جواب نرسیدید؟

SuTeDell
یک شنبه 09 مهر 1391, 13:39 عصر
من از ی کامپوننت به نام PersianTimePicker استفاده میکنم.در SQL هم تاریخ رو DateTime2 گذاشتم.
واسه ذخیره سازی مشکل دارم.
در ذخیره،تاریخ بصورت میلادی در دیتاگرید نمایش داده میشه.واسه درست کردنش باید چکار کنم؟!!

یباره دیگه در SQL تاریخ char(10) گذاشتم این بار دو مشکل شد.
یکی اینکه ترتیب تاریخ درست نیست.یعنی ماه/روز/سال شده و این اشتباس.
مشکل دوم اینکه تو گزارش گیری نمیشه از علامتهای > یا < استفاده کرد.چون char(10) انتخاب کردم.
حالا پیشنهاد شما چیه و باید چجوری درستش کنم؟!!!!
ممنون:لبخندساده:

morteza66m
جمعه 25 مهر 1393, 15:44 عصر
نمایش تاریخ میلادی ذخیره شده در فیلد datetime به شکل شمسی در datagridview
سلام
ممنون میشم راهنماییم کنید.

سلام
به صورت زیر میتونی اینکارو انجام بدی:

private void dgvBuyFresh_CellFormatting(object sender, DataGridViewCellFormattingEventArgs e)
{
if (dgvBuyFresh.Columns[e.ColumnIndex].Name == "dateDataGridViewTextBoxColumn")
{
if (e.Value != null)
{
DateTime dt1 = DateTime.Parse(e.Value.ToString());
e.Value = FarsiLibrary.Utils.PersianDateConverter.ToPersianD ate(dt1).ToString();
e.FormattingApplied = true;
}
}
}

dateDataGridViewTextBoxColumn اسم ستون تاریخ تو dataGridView توی فرمت هستش
یا علی

bmvgod
چهارشنبه 01 خرداد 1398, 23:27 عصر
سلام
به صورت زیر میتونی اینکارو انجام بدی:

private void dgvBuyFresh_CellFormatting(object sender, DataGridViewCellFormattingEventArgs e)
{
if (dgvBuyFresh.Columns[e.ColumnIndex].Name == "dateDataGridViewTextBoxColumn")
{
if (e.Value != null)
{
DateTime dt1 = DateTime.Parse(e.Value.ToString());
e.Value = FarsiLibrary.Utils.PersianDateConverter.ToPersianD ate(dt1).ToString();
e.FormattingApplied = true;
}
}
}

dateDataGridViewTextBoxColumn اسم ستون تاریخ تو dataGridView توی فرمت هستش
یا علی

با سلام خدمت شما بزرگواران
دستور FarsiLibrary.Utils.PersianDateConverter داخل کدوم کتابخانه ست؟
پیدا نمیکنم کتابخانه رو.
ممنون میشم راهنماییم کنید.
باتشکر از تمامی دوستان و بزرگواران

bmvgod
چهارشنبه 01 خرداد 1398, 23:36 عصر
سلام،
شما میتونید یه حلقه بزارین و در اون تمام فیلد های تاریخ رو به شمسی تبدیل کنید:



using FarsiLibrary.Utils;
using System.Globalization;
if (Dgv.Rows.Count > 0)
for (int i = 0; i < Dgv.Rows.Count; i++)
{
Dgv.Rows[i].Cells["farsiDate"].Value = ((PersianDate)Convert.ToDateTime(Dgv.Rows[i].Cells["GregorianDate"].Value)).ToString("g");
}


farsiDate : سلولیه که تاریخ شمسی توی اون نمایش داده میشه.
GregorianDate : تاریخ میلادی که به صورت مخفی است.

با سلام خدمت بزرگواران
قسمت farsiDate رو متوجه شدم ولی قسمت GregorianDate رو متوجه نمیشم، از کجا باید خونده بشه؟
اسم ستون من که تاریخ رو درونش تاریخ به میلادی ذخیره میشه InsertDate هست که بجای farsiDate اسم ستون تاریخ جدول که InsertDate جایگزین میشه.
سوالم اینه بجای GregorianDate اسم کدوم ستون رو باید بیارم؟ و اینکه در خط 6 در ToString منظور از g چیه؟ از کجا اومده؟
ممنون میشم راهنماییم کنید.
باتشکر از تمامی دوستان و بزرگواران