PDA

View Full Version : مشکل در تغییر تاریخ سیستم



javad_r_85
چهارشنبه 13 مرداد 1389, 01:54 صبح
با سلام .من از کدهای زیر برای تغییر تاریخ سیستم استفاده میکنم و لی مشکلی که دارم اینه که تارخ سیستم عوض می شه ولی روز آن یک روز کمتر می شود.


using Microsoft.Win32;
using System.Runtime.InteropServices;
using System.Management;
using System.Diagnostics;

public struct SYSTEMTIME
{
public short wYear;
public short wMonth;
public short wDayOfWeek;
public short wDay;
public short wHour;
public short wMinute;
public short wSecond;
public short wMilliseconds;
}

[DllImport("kernel32.dll", SetLastError = true)]
public static extern bool SetSystemTime([In] ref SYSTEMTIME st);




مثال:


private void Form1_Load(object sender, EventArgs e)
{
SYSTEMTIME st = new SYSTEMTIME();
st.wYear = 2003 ;
st.wMonth = 5;
st.wDay = 22;
st.wHour = 0;
st.wMinute =0;
st.wSecond = 0;
SetSystemTime(ref st);
}


در اینجا تاریخ 2003/5/22 را به کد دادم ولی تاریخ سیستم من 2003/5/21 را نشان میدهد که یک روز کمتر است از دوستان می خوام تا مرا راهنمایی کنند.

در ضمن من برای تغییر فرمت تاریخ سیستم از طریق دستکاری رجیستری می تونم این کار را بکنم ولی باید سیستم ریستارت شود تا تغییرات اعمال شود .آیا راهی هست که بدون اینکه سیستم ریستارت شود بتونم فرمت تاریخ را تغییر دهم مثلا به صورت yyyy/MM/dd
با تشکر

jalalx
چهارشنبه 13 مرداد 1389, 05:35 صبح
تاریخ سیستم عوض می شه ولی روز آن یک روز کمتر می شود.

دقیقا نمی دونم! شاید به خاطر اینه که شما ساعت رو صفر دادید؟ با اعداد دیگه امتحان کنید!

یا یواشکی یه +1 به روز اضافه کنین!!! :لبخند:

javad_r_85
چهارشنبه 13 مرداد 1389, 07:23 صبح
از دوستان کسی نیست کمک کنه

برای غییر فرمت تاریخ سیستم چه کار کنم. از طریق دستکاری رجیستری می تونم این کار را بکنم ولی باید سیستم ریستارت شود تا تغییرات اعمال شود .آیا راهی هست که بدون اینکه سیستم ریستارت شود بتونم فرمت تاریخ را تغییر دهم مثلا به صورت yyyy/MM/dd
با تشکر

javad_r_85
چهارشنبه 13 مرداد 1389, 08:42 صبح
با تشکر از دوستان گرامی بالاخره خودم تونستم این مشکلا حل کنم و این کد را واسه کسانی که مانند من با این مشکل روبرو شدند قرار میدم.یکی از مباحث پیچیده در سی شارپ کار با همین تاریخها می باشد.

تغییر تاریخ و زمان سیستم

فضای نام زیر را اضافه میکنیم
using System.Runtime.InteropServices;

API
مربوطه را نیز اضافه میکنیم

[DllImport("kernel32.dll")]
static extern bool SetSystemTime(ref SYSTEMTIME time);


[StructLayoutAttribute(LayoutKind.Sequential)]
private struct SYSTEMTIME
{
public short year;
public short month;
public short dayOfWeek;
public short day;
public short hour;
public short minute;
public short second;
public short milliseconds;
}



اکنون تابعی می نوسیسم که یک پارامتر از نوع دیتا تایم دریافت کرده
و تاریخ و زمان سیستم را تغییر میدهد

private void ChangeDateAndTime(DateTime NewTime)
{
SYSTEMTIME st;
st.year = (short)NewTime.Year;
st.month = (short)NewTime.Month;
st.dayOfWeek = (short)NewTime.DayOfWeek;
st.day = (short)NewTime.Day;
st.hour = (short)NewTime.Hour;
st.minute = (short)NewTime.Minute;
st.second = (short)NewTime.Second;
st.milliseconds = (short)NewTime.Millisecond;

SetSystemTime(ref st);
}




تاریخ ارسال شده برای تابع بالا حتما باید با فرمت UniversalTime باشد.


درمثال زیر ایتدا تاریخ شمسی را دریافت کرده سپس به میلادی تبدیل میکند و تریخ سیستم را تغییر

میدهد

System.Globalization.PersianCalendar x = new

System.Globalization.PersianCalendar();
DateTime dt = x.ToDateTime(1389, 5, 15,0, 0, 0, 0, 0).ToUniversalTime();//

(year,maonth,day,hour,minut,second,milisecound)

ChangeDateAndTime(dt);




در ادامه یه تابع مینویسم که خیلی کاربرد دارد این تابع تاریخ سیستم را به شمسی تبدیل میکند و به دو صورت حروفی مانند دوشنبه 16 شهریور 1388 و یا 1388/5/15 برمیگرداند این تابع دو پارامتر دارد که پارامتر اول از نو ع datatime و پارامتر دوم از نوع boolean می باشد که اگر true وارد شود تاریخ را به صورت کامل و حروفی بر می گرداند در غیر اینصور ت به صورت کوتا ه برمی گرداند.

public string toLongPersianDate(DateTime d, Boolean b)
{

persianClander = new PersianCalendar();

if (b)
{
string toLongPersianData = "";
string[] month = new string[12];
string[] day = new string[7];

int dayOfMonth;
DayOfWeek dayOfWeek;
dayOfWeek = persianClander.GetDayOfWeek(DateTime.Now);
string str;

month[0] = "فروردین";
month[1] = "اردیبهشت";
month[2] = "خرداد";
month[3] = "تیر";
month[4] = "مرداد";
month[5] = "شهریور";
month[6] = "مهر";
month[7] = "آبان";
month[8] = "آذر";
month[9] = "دی";
month[10] = "بهمن";
month[11] = "اسفند";

day[0] = "شنبه";
day[1] = "یکشنبه";
day[2] = "دوشنبه";
day[3] = "سه شنبه";
day[4] = "چهارشنبه";
day[5] = "پنج شنبه";
day[6] = "جمعه";

switch (dayOfWeek.ToString())
{

case "Saturday":
toLongPersianData = day[0].ToString();
break;

case "Sunday":
toLongPersianData = day[1].ToString();
break;

case "Monday":
toLongPersianData = day[2].ToString();
break;

case "Tuesday":
toLongPersianData = day[3].ToString();
break;

case "Wednesday":
toLongPersianData = day[4].ToString();
break;

case "Thursday":
toLongPersianData = day[5].ToString();
break;

case "Friday":
toLongPersianData = day[6].ToString();
break;
}



dayOfMonth = persianClander.GetDayOfMonth(DateTime.Now);

toLongPersianData +=" "+ dayOfMonth.ToString();

str = Convert.ToString(dayOfMonth);

dayOfMonth = persianClander.GetMonth(DateTime.Now);

toLongPersianData += " " + month[dayOfMonth - 1];

str += "/" + Convert.ToString(dayOfMonth);

dayOfMonth = persianClander.GetYear(DateTime.Now);

toLongPersianData += " " + Convert.ToString(dayOfMonth);

str += "/" + Convert.ToString(dayOfMonth);

return toLongPersianData;
}

else
{

int year = persianClander.GetYear(d);
int month = persianClander.GetMonth(d);
int day = persianClander.GetDayOfMonth(d);

return year.ToString() + "/" + month + "/" + day;
}
}




حالا این متد را فراخوانی میکنم.
label10.Text = toLongPersianDate(DateTime.Now, true );