اشتراکها
سیلورلایت به این زودیها از بین نخواهد رفت و بیشتر تغییر کاربری خواهد داده برای تولید نسخه 6 Silverlight رای دهید
نظرات مطالب
نحوه استفاده از ViewModel در ASP.NET MVC
یعنی جواب قطعی براش نیست؟چون رای گیری نمیتونه ملاک خوبی باشه بنظرم
آیا این دو اسکریپت با هم تداخل دارن؟ جدا جدا اجرا میشن ولی با هم سیستم امتیاز دهی از کار میفته
یا نحوه استفادهی من غلطه؟
با تشکر
یا نحوه استفادهی من غلطه؟
$(document).ready(function () { $("#moreInfoButton").InfiniteScroll({ moreInfoDiv: '#MoreInfoDiv', progressDiv: '#ProgressDiv', loadInfoUrl: '/Media/PagedIndex', loginUrl: '/login', errorHandler: function () { alert('خطایی رخ داده است'); }, completeHandler: function () { }, noMoreInfoHandler: function () { alert('اطلاعات بیشتری یافت نشد'); } }); $(".rating.stars.active").StarRating({ ratingStarsSpan: '.rating.stars', postInfoUrl: '/Media/SaveRatings', loginUrl: '/login', errorHandler: function () { alert('خطایی رخ داده است'); }, completeHandler: function () { alert('با تشکر! رای شما با موفقیت ثبت شد'); }, onlyOneTimeHandler: function () { alert('فقط یکبار میتوانید به ازای هر مطلب رای دهید'); } }); } );
با تشکر
اگر به سورسهای ASP.NET Identity نگارشهای 2 و 3 دقت کنیم، این تفاوت به وضوح قابل مشاهدهاست:
در نگارش 2
در نگارش 3
و در کل، در طراحی تمام قسمتها و اجزای NET Core. بجای استفادهی از DateTime متداول، شاهد استفادهی گستردهای از DateTimeOffset هستیم که از زمان ارائهی NET 3.5. معرفی شدهاست. چرا؟
مشکل ساختار DateTime چیست؟
تمام کسانیکه مدتی با NET Framework. کار کردهاند، قطعا از ساختار DateTime برای ذخیره سازی اطلاعاتی زمانی محلی استفاده کردهاند. اما مشکل DateTime چیست؟
فرض کنید در حال استفادهی از یک وب سرویس قرار گرفتهی در یک منطقهی زمانی غربی هستید و این وب سرویس تاریخ تولد افراد را با یک چنین فرمتی ارائه میدهد:
در این حالت برای استفادهی متداول از این زمان میتوان به صورت زیر عمل کرد:
هرچند این عملیات ساده به نظر میرسد، اما با توجه به قرارگیری سرور برنامه در یک منطقهی زمانی دیگر، زمان پردازش شده به صورت ذیل خواهد بود:
اتفاقی که رخ دادهاست، تبدیل DateTime رسیده به زمان محلی سرور است و در این حالت تاریخ تولد شخص از یکم ماه، به 29 ام ماه قبل تغییر کردهاست. علت آن هم وجود 05:00 یا offset (فاصلهی با UTC) در تاریخ ارائه شدهاست.
چگونه میتوان offset را در تاریخ ذکر کرد، اما از تبدیل آن به زمان محلی جلوگیری کرد؟ این مورد جاییاست که ساختار DateTimeOffset بکار خواهد آمد.
DateTimeOffset و ذخیرهی DateTime به همراه Offset
ساختار کلی DateTimeOffset بسیار واضح بوده و تشکیل شدهاست از Date + Time + Offset. اهمیت آن نیز به ذخیره سازی اطلاعات منطقهی زمانی، در قسمت Offset ساختار ارائه شده بر میگردد. ساختار DateTimeOffset در بسیاری از موارد با DateTime متداول یکسان است و تفاوتهای آن شامل خواص اضافی ذیل هستند:
- DateTime: قسمت DateTime مقدار را بدون توجه به offset باز میگرداند (به زمان محلی تبدیل نخواهد شد).
- LocalDateTime: قسمت DateTime را با توجه به منطقه زمانی سروری که برنامه بر روی آن اجرا میشود، بر میگرداند.
- Offset: فاصلهی زمانی با UTC را بیان میکند. یک TimeSpan است که فاصلهی با UTC را بیان میکند.
- UtcDateTime: قسمت DateTime را با توجه به UTC time ارائه میکند.
در این ساختار خواص Now و UtcNow نیز یک DateTimeOffset را باز میگردانند.
چه زمانی از DateTime و چه زمانی از DateTimeOffset استفاده کنیم؟
اگر هدف شما ذخیره سازی اطلاعات زمانی محلی (جایی که سرور برنامه قرار دارد) است، از DateTime استفاده کنید. اما اگر میخواهید مقادیر زمانی را در مناطق زمانی دیگری نیز مورد استفاده قرار دهید و علاقمندید که قسمت TimeZone این اطلاعات نیز حفظ شود، از DateTimeOffset استفاده نمائید.
در این حالت روش پردازش صحیح مثال ابتدای بحث به صورت ذیل خواهد بود:
و در اینجا اگر علاقمند به مقایسهی این مقدار با یک زمان محلی هستیم، میتوان از خاصیت Date آن استفاده کرد:
مطابق توصیهی تیم BCL، استفاده از DateTimeOffset روش ترجیح داده شدهی برای ذخیره سازی اطلاعات اکثر سناریوهای زمانی است.
SQL Server و پشتیبانی از DateTimeOffset
ساختار دادهای datetime در SQL Server نیز اطلاعات منطقهی زمانی را ذخیره نمیکند و درصورت بازیابی آن در برنامه، این زمان، به زمان محلی تبدیل خواهد شد. برای رفع این مشکل، از زمان ارائهی SQL Server 2008، ساختار DateTimeOffset نیز به نوعهای دادهآی SQL Server اضافه شدهاست:
این ساختار، اطلاعات +00:00 timezone را نیز ذخیره میکند.
مشکلات نوع datetime در بانکهای اطلاعاتی برای ذخیره سازی اطلاعات UTC در آنها
یکی از روشهای توصیه شدهی جهت ذخیره سازی اطلاعات زمانی در بانکهای اطلاعاتی، استفادهی از DateTime.UtcNow است. اما زمانیکه از DateTime.UtcNow برای ذخیره سازی اطلاعاتی زمانی استفاده میکنیم، به معنای دریافت زمان محلی بر اساس و نسبت به UTC است. در این حالت هنگامیکه آنرا از یک فیلد datetime بانک اطلاعاتی بازیابی میکنیم، از نوع Unspecified خواهد بود (DateTimeKind.Unspecified) و به صورت خودکار به DateTimeKind.Local ترجمه میشود. یعنی مقدار آن مجددا به زمان محلی شیفت پیدا خواهد کرد چون نوع datetime بانک اطلاعاتی درکی از DateTimeKind و منطقهی زمانی ندارد.
به همین جهت روش بازیابی صحیح این زمان UTC، نیاز به قید صریح DateTimeKind.Utc را خواهد داشت:
اما اگر نوع فیلد را DateTimeOffset قرار دهیم و از DateTimeOffset.UTCNow برای ذخیره سازی اطلاعات زمانی استفاده کنیم، SqlDataReader بدون نیاز به تبدیلات فوق، قادر است اطلاعات آنرا به نحو صحیحی دریافت و پردازش کند.
خلاصهی بحث
اگر برنامهی وب شما امروز در یک سرور در اروپا هاست میشود و سال بعد در یک سرور کانادایی، استفادهی DateTime.UtcNow کمک زیادی به برنامه نکرده و خروجی SQL Server در این حالت DateTimeKind.Unspecified است و این زمان مجددا بر اساس محل سرور جدید و تنظیمات منطقهی زمانی آن، به حالت DateTimeKind.Local شیفت داده میشود که الزاما خروجی صحیحی را به همراه نخواهد داشت و یا اگر قرار است از وب سرویس شما در مناطق زمانی مختلفی استفاده کنند نیز DateTime.UtcNow انتخاب مناسبی نیست. جهت درج فاصلهی صحیح با UTC و ذخیره سازی آن در بانک اطلاعاتی، روش توصیه شده، استفاده از نوع DateTimeOffset است و در این حالت دیگر SQL Server اطلاعات را با فرمت زمانی Unspecified بازگشت نمیدهد و در سمت کلاینت نیازی به تبدیلات خاصی نخواهد بود.
در نگارش 2
public virtual DateTime? LockoutEndDateUtc { get; set; }
public virtual DateTimeOffset? LockoutEnd { get; set; }
مشکل ساختار DateTime چیست؟
تمام کسانیکه مدتی با NET Framework. کار کردهاند، قطعا از ساختار DateTime برای ذخیره سازی اطلاعاتی زمانی محلی استفاده کردهاند. اما مشکل DateTime چیست؟
فرض کنید در حال استفادهی از یک وب سرویس قرار گرفتهی در یک منطقهی زمانی غربی هستید و این وب سرویس تاریخ تولد افراد را با یک چنین فرمتی ارائه میدهد:
2012-03-01 00:00:00-05:00
var dateString = "2012-03-01 00:00:00-05:00"; var birthDay = DateTime.Parse(dateString);
2012-02-29 11:00:00 PM
چگونه میتوان offset را در تاریخ ذکر کرد، اما از تبدیل آن به زمان محلی جلوگیری کرد؟ این مورد جاییاست که ساختار DateTimeOffset بکار خواهد آمد.
DateTimeOffset و ذخیرهی DateTime به همراه Offset
ساختار کلی DateTimeOffset بسیار واضح بوده و تشکیل شدهاست از Date + Time + Offset. اهمیت آن نیز به ذخیره سازی اطلاعات منطقهی زمانی، در قسمت Offset ساختار ارائه شده بر میگردد. ساختار DateTimeOffset در بسیاری از موارد با DateTime متداول یکسان است و تفاوتهای آن شامل خواص اضافی ذیل هستند:
- DateTime: قسمت DateTime مقدار را بدون توجه به offset باز میگرداند (به زمان محلی تبدیل نخواهد شد).
- LocalDateTime: قسمت DateTime را با توجه به منطقه زمانی سروری که برنامه بر روی آن اجرا میشود، بر میگرداند.
- Offset: فاصلهی زمانی با UTC را بیان میکند. یک TimeSpan است که فاصلهی با UTC را بیان میکند.
- UtcDateTime: قسمت DateTime را با توجه به UTC time ارائه میکند.
در این ساختار خواص Now و UtcNow نیز یک DateTimeOffset را باز میگردانند.
چه زمانی از DateTime و چه زمانی از DateTimeOffset استفاده کنیم؟
اگر هدف شما ذخیره سازی اطلاعات زمانی محلی (جایی که سرور برنامه قرار دارد) است، از DateTime استفاده کنید. اما اگر میخواهید مقادیر زمانی را در مناطق زمانی دیگری نیز مورد استفاده قرار دهید و علاقمندید که قسمت TimeZone این اطلاعات نیز حفظ شود، از DateTimeOffset استفاده نمائید.
در این حالت روش پردازش صحیح مثال ابتدای بحث به صورت ذیل خواهد بود:
string birthDay = "2012-03-01 00:00:00-05:00"; var dtOffset = DateTimeOffset.Parse(birthDay);
var theDay = dtOffset.Date;
SQL Server و پشتیبانی از DateTimeOffset
ساختار دادهای datetime در SQL Server نیز اطلاعات منطقهی زمانی را ذخیره نمیکند و درصورت بازیابی آن در برنامه، این زمان، به زمان محلی تبدیل خواهد شد. برای رفع این مشکل، از زمان ارائهی SQL Server 2008، ساختار DateTimeOffset نیز به نوعهای دادهآی SQL Server اضافه شدهاست:
این ساختار، اطلاعات +00:00 timezone را نیز ذخیره میکند.
مشکلات نوع datetime در بانکهای اطلاعاتی برای ذخیره سازی اطلاعات UTC در آنها
یکی از روشهای توصیه شدهی جهت ذخیره سازی اطلاعات زمانی در بانکهای اطلاعاتی، استفادهی از DateTime.UtcNow است. اما زمانیکه از DateTime.UtcNow برای ذخیره سازی اطلاعاتی زمانی استفاده میکنیم، به معنای دریافت زمان محلی بر اساس و نسبت به UTC است. در این حالت هنگامیکه آنرا از یک فیلد datetime بانک اطلاعاتی بازیابی میکنیم، از نوع Unspecified خواهد بود (DateTimeKind.Unspecified) و به صورت خودکار به DateTimeKind.Local ترجمه میشود. یعنی مقدار آن مجددا به زمان محلی شیفت پیدا خواهد کرد چون نوع datetime بانک اطلاعاتی درکی از DateTimeKind و منطقهی زمانی ندارد.
به همین جهت روش بازیابی صحیح این زمان UTC، نیاز به قید صریح DateTimeKind.Utc را خواهد داشت:
public static class SqlDataReaderExtensions { public static DateTime GetDateTimeUtc(this SqlDataReader reader, string name) { int fieldOrdinal = reader.GetOrdinal(name); DateTime unspecified = reader.GetDateTime(fieldOrdinal); return DateTime.SpecifyKind(unspecified, DateTimeKind.Utc); } }
خلاصهی بحث
اگر برنامهی وب شما امروز در یک سرور در اروپا هاست میشود و سال بعد در یک سرور کانادایی، استفادهی DateTime.UtcNow کمک زیادی به برنامه نکرده و خروجی SQL Server در این حالت DateTimeKind.Unspecified است و این زمان مجددا بر اساس محل سرور جدید و تنظیمات منطقهی زمانی آن، به حالت DateTimeKind.Local شیفت داده میشود که الزاما خروجی صحیحی را به همراه نخواهد داشت و یا اگر قرار است از وب سرویس شما در مناطق زمانی مختلفی استفاده کنند نیز DateTime.UtcNow انتخاب مناسبی نیست. جهت درج فاصلهی صحیح با UTC و ذخیره سازی آن در بانک اطلاعاتی، روش توصیه شده، استفاده از نوع DateTimeOffset است و در این حالت دیگر SQL Server اطلاعات را با فرمت زمانی Unspecified بازگشت نمیدهد و در سمت کلاینت نیازی به تبدیلات خاصی نخواهد بود.
همانطور که در توضیح پروژه PersianDateTime آمده است، کلاس PersianDateTime جایگزینی است برای System.DateTime برای استفاده در پروژههایی که احتیاج به تاریخ شمسی و ساعت رسمی ایران یا سایر کشورهای فارسیزبان، مستقل از Time Zone سیستم و در نظر گرفتن Daylight Saving Time، دارند. این کلاس شامل اکثر متدها، پراپرتیها و عملگرهای متداول System.DateTime است.
دسترسی به تاریخ و ساعت فعلی :
PersianDateTime now = PersianDateTime.Now; string persianDateTime = now.ToString(); // 1392/03/09 23:37:57 string persianDate = now.ToString(PersianDateTimeFormat.Date); // 1392/03/09 string persianFullDateTime = now.ToString("dddd d MMMM yyyy ساعت hh:mm:ss tt"); // پنج شنبه 9 خرداد 1392 ساعت 11:37:57 ب.ظ TimeSpan persianTime = now.TimeOfDay; // 23:37:57.4641984
نحوه محاسبه PersianDateTime.Now بر اساس فیلد استاتیک PersianDateTime.Mode است که مقدار پیشفرض آن PersianDateTimeMode.UtcOffset است.
PersianDateTime.Mode را میتوان یکی از سه مقدار زیر قرار داد :
PersianDateTime.Mode را میتوان یکی از سه مقدار زیر قرار داد :
- System : بر اساس تاریخ و زمان سیستم (Time Zone فعلی سیستم)
- PersianTimeZoneInfo : بر اساس Time Zone تعیین شده در فیلد استاتیک PersianDateTime.PersianTimeZoneInfo (مستقل از Time Zone سیستم)
- UtcOffset : بر اساس اختلاف ساعت با UTC، مشخص شده در فیلد استاتیک PersianDateTime.OffsetFromUtc (مستقل از Time Zone سیستم)
مقدار پیشفرض PersianDateTime.PersianTimeZoneInfo برابر Iran Standard Time Zone است. توجه داشته باشید که در این حالت از DaylightSavingTime تعیین شده در Time Zone استفاده خواهد شد که مثلا برای ایران با زمان واقعی آن اختلاف دارد و باید آنرا اصلاح کرد .
مقدار پیشفرض PersianDateTime.OffsetFromUtc برابر 3 ساعت و نیم است. در این حالت DaylightSavingTime با توجه به مقادیر سه فیلد استاتیک DaylightSavingTimeStart ،DaylightSavingTimeEnd و DaylightSavingTime تعیین میشود که به صورت پیشفرض برابر ساعت 24 اول فروردین، ساعت 24 سیام شهریور و یک ساعت است.
تمام فیلدهای استاتیک ذکر شده به صورت public تعریف شدهاند تا برنامهنویسان سایر کشورهای فارسیزبان بتوانند به دلخواه خود آنرا تغییر دهند.
نحوه کار با مقادیر رشتهای تاریخ شمسی هم اینگونه است :
PersianDateTime persianDate1 = PersianDateTime.Parse("1392/03/02"); PersianDateTime persianDate2 = PersianDateTime.Parse("1392/03/02", "23:32:56");
چند سازنده هم وجود دارد برای کسانی که تاریخ را به صورت int و ساعت را int یا short (بدون ثانیه) ذخیره میکنند :
تبدیل تاریخ میلادی به شمسی :
تبدیل تاریخ شمسی به میلادی :
علاوه بر متد ToString معمولی، دو overload دیگر از این متد برای نمایش فرمتهای مختلف PersianDateTime وجود دارد :
که اولی برای فرمتهای معمول و دومی برای هر نوع فرمت دلخواه قابل استفاده است که چند نمونه آنرا در قسمت تعیین تاریخ و ساعت فعلی دیدید.
برخی از خصوصیات کلاس PersianDateTime :
همچنین تمام عملگرهای +، -، >، <، =>، =<، ==، و =! قابل استفاده هستند.
PersianDateTime persianDate1 = new PersianDateTime(13920310); PersianDateTime persianDate2 = new PersianDateTime(13920310, 233256); PersianDateTime persianDate3 = new PersianDateTime(13920310, (short)2332);
تبدیل تاریخ میلادی به شمسی :
DateTime miladiDate = new DateTime(2013, 5, 31); PersianDateTime persianDate = new PersianDateTime(miladiDate);
تبدیل تاریخ شمسی به میلادی :
PersianDateTime persianDate = PersianDateTime.Parse("1392/03/02"); DateTime miladiDate = persianDate.ToDateTime();
علاوه بر متد ToString معمولی، دو overload دیگر از این متد برای نمایش فرمتهای مختلف PersianDateTime وجود دارد :
public string ToString(PersianDateTimeFormat format); public string ToString(string format);
برخی از خصوصیات کلاس PersianDateTime :
- Year : سال
- Month : ماه
- Day : روز
- TimeOfDay : زمان سپری شده از ابتدای روز
- TimeOfWeek :زمان سپری شده از ابتدای هفته
- TimeOfMonth : زمان سپری شده از ابتدای ماه
- TimeOfYear : زمان سپری شده از ابتدای سال
- DaysInYear : تعداد روز سال
- DaysInMonth : تعداد روز ماه
- DayOfWeek : چندمین روز هفته
- DayOfYear : چندمین روز سال
- DayName : نام روز
- MonthName : نام ماه
- Date : تاریخ بدون زمان
- FirstDayOfWeek : اولین روز هفته
- LastDayOfWeek : آخرین روز هفته
- FirstDayOfMonth : اولین روز ماه
- LastDayOfMonth : آخرین روز ماه
- FirstDayOfYear : اولین روز سال
- LastDayOfYear : آخرین روز سال
برخی دیگر از متدهای کلاس PersianDateTime :
public PersianDateTime Add(TimeSpan value); public PersianDateTime AddDays(double value); public PersianDateTime AddMonths(int months); public PersianDateTime AddYears(int value); public PersianDateTime AddHours(double value); public PersianDateTime AddMinutes(double value); public PersianDateTime AddSeconds(double value);
نظرات مطالب
معماری لایه بندی نرم افزار #3
لطفا برای اینکه نظرات حالت فنیتر و غنای بیشتری پیدا کنند، از ارسال پیامهای تشکر خودداری کنید. برای ابراز احساسات و همچنین تشکر، لطفا از گزینه رای دادن به هر مطلب که ذیل آن قرار دارد استفاده کنید.
این مطلب تا این لحظه 76 بار دیده شده، اما فقط 4 رای دارد. لطفا برای ابراز تشکر، امتیاز بدهید. ممنون.
این مطلب تا این لحظه 76 بار دیده شده، اما فقط 4 رای دارد. لطفا برای ابراز تشکر، امتیاز بدهید. ممنون.
نظرات نظرسنجیها
Sql vs noSql vs Both کدام انتخاب بهتر است؟
منظور گزارشهای آماری Big data بود در این نظر سنجی که بهترین گزینه nosql هست ولی با توجه به اینکه هردو سناریو هم برای rdms هم nosql در یک پروژه وجود دارد گفتم نظر دوستان رو بدونم که انتخاب هاشون به چه شکل هست.
من خودم گزینه
استفاده از NoSql که رای نیاورده بیشتر مدنظرم بود ... که با این نظر سنجی باید بیشتر روش فکر کنم. (البته به اشتباه گزینه دیگه ای رای دادم !)
با تشکر
جهت اطلاع!
لغو قانون «تغییر ساعت»
ابوترابی عضو کمیسیون امور داخلی کشور و شوراها: با موافقت نمایندگان مجلس قانون «تغییر ساعت» لغو شد. براساس نظر کارشناسان تغییر ساعت توجیه اقتصادی نداشته و مضرات زیادی نیز دارد. طبق قانون از سال ۱۴۰۱ ساعت قدیم و جدید وجود نخواهد داشت.
ابوترابی عضو کمیسیون امور داخلی کشور و شوراها: با موافقت نمایندگان مجلس قانون «تغییر ساعت» لغو شد. براساس نظر کارشناسان تغییر ساعت توجیه اقتصادی نداشته و مضرات زیادی نیز دارد. طبق قانون از سال ۱۴۰۱ ساعت قدیم و جدید وجود نخواهد داشت.
پ.ن.
این طرح قطعی نشدهاست و این موضوع هفته آینده در نوبت دستور کار صحن مجلس قرار دارد.
نظرات نظرسنجیها
آیا به یادگیری یا ادامهی استفاده از AngularJS خواهید پرداخت؟
خوب به نظر این طبیعی به نظر میرسه. آنگولار یه پروژه یک نفره بود که گوگل تو دل کار خودش ازش پشتیبانی کرد و اینکه بتونه به یه محصول قابل استفاده برسه و نیازمندیها و نیازسنجیها در موردش به رای گذاشته بشه طول میکشه و از اونجایی که این مشکلات رو میدونستم هنوز سمتش نرفتم و ترجیح میدم که نسخه دو اون منتشر بشه و بعد یه تحقیق دیگه در موردش انجام بدم.
Ember هم همینطور. قدرتمند هستش ولی این فریم ورک هم داره مثل آنگولار جون میگیره و مطمئن هستم که جنگ سختی بین این دوتا رو شاهد خواهیم بود.
Ember هم همینطور. قدرتمند هستش ولی این فریم ورک هم داره مثل آنگولار جون میگیره و مطمئن هستم که جنگ سختی بین این دوتا رو شاهد خواهیم بود.