Reputation: 674
I have an object of type DateTime like this :
var date = new DateTime(1999,1,18);
then i call ToString method with fa-IR culture info like this :
var strDate = date.ToString("yyyy/MM/dd",CultureInfo.GetCultureInfo("fa-IR"));
i expect strDate to be "1377/10/28" which is equivalent of "1999/1/18" in fa-IR culture . but after calling ToString method i get "1999/1/18" which is not true .
Anyone knows where is the problem and how to solve it?
Upvotes: 0
Views: 424
Reputation: 813
Try this out:
Thread.CurrentThread.CurrentUICulture = new CultureInfo("fa-IR");
var date = new DateTime(1999, 1, 18);
var strDate = date.ToString("yyyy/MM/dd", CultureInfo.GetCultureInfo("fa-IR"));
Console.WriteLine(strDate);
Console.ReadKey();
This gives the output "1377/10/28"
Upvotes: 0
Reputation: 2021
you need to override culture calendar, and also to receive persian names, you need to override them as well....
It's something like this, more or less:
using System;
using System.Collections.Generic;
using System.Globalization;
using System.Reflection;
namespace Ravis24.Helpers
{
public class PersianCulture : CultureInfo
{
private readonly System.Globalization.Calendar cal;
private readonly System.Globalization.Calendar[] optionals;
public PersianCulture()
: this("fa-IR", true)
{ }
public PersianCulture(string cultureName, bool useUserOverride)
: base(cultureName, useUserOverride)
{
cal = base.OptionalCalendars[0];
var optionalCalendars = new List<System.Globalization.Calendar>();
optionalCalendars.AddRange(base.OptionalCalendars);
optionalCalendars.Insert(0, new PersianCalendar());
Type formatType = typeof(DateTimeFormatInfo);
Type calendarType = typeof(System.Globalization.Calendar);
PropertyInfo idProperty = calendarType.GetProperty("ID", BindingFlags.Instance | BindingFlags.NonPublic);
FieldInfo optionalCalendarfield = formatType.GetField("optionalCalendars", BindingFlags.Instance | BindingFlags.NonPublic);
var newOptionalCalendarIDs = new Int32[optionalCalendars.Count];
for (int i = 0; i < newOptionalCalendarIDs.Length; i++)
newOptionalCalendarIDs[i] = (Int32)idProperty.GetValue(optionalCalendars[i], null);
optionalCalendarfield.SetValue(DateTimeFormat, newOptionalCalendarIDs);
optionals = optionalCalendars.ToArray();
cal = optionals[0];
DateTimeFormat.Calendar = optionals[0];
DateTimeFormat.MonthNames = new[] { "فروردین", "اردیبهشت", "خرداد", "تیر", "مرداد", "شهریور", "مهر", "آبان", "آذر", "دی", "بهمن", "اسفند", "" };
DateTimeFormat.MonthGenitiveNames = new[] { "فروردین", "اردیبهشت", "خرداد", "تیر", "مرداد", "شهریور", "مهر", "آبان", "آذر", "دی", "بهمن", "اسفند", "" };
DateTimeFormat.AbbreviatedMonthNames = new[] { "فروردین", "اردیبهشت", "خرداد", "تیر", "مرداد", "شهریور", "مهر", "آبان", "آذر", "دی", "بهمن", "اسفند", "" };
DateTimeFormat.AbbreviatedMonthGenitiveNames = new[] { "فروردین", "اردیبهشت", "خرداد", "تیر", "مرداد", "شهریور", "مهر", "آبان", "آذر", "دی", "بهمن", "اسفند", "" };
DateTimeFormat.AbbreviatedDayNames = new string[] { "ی", "د", "س", "چ", "پ", "ج", "ش" };
DateTimeFormat.ShortestDayNames = new string[] { "ی", "د", "س", "چ", "پ", "ج", "ش" };
DateTimeFormat.DayNames = new string[] { "یکشنبه", "دوشنبه", "ﺳﻪشنبه", "چهارشنبه", "پنجشنبه", "جمعه", "شنبه" };
DateTimeFormat.AMDesignator = "ق.ظ";
DateTimeFormat.PMDesignator = "ب.ظ";
DateTimeFormat.ShortDatePattern = "yyyy/MM/dd";
DateTimeFormat.ShortTimePattern = "HH:mm";
DateTimeFormat.LongTimePattern = "HH:mm:ss";
DateTimeFormat.FullDateTimePattern = "yyyy/MM/dd HH:mm:ss";
}
public override System.Globalization.Calendar Calendar
{
get { return cal; }
}
public override System.Globalization.Calendar[] OptionalCalendars
{
get { return optionals; }
}
public static DateTime PersianToGregorianUS(DateTime faDate)
{
return new PersianCalendar().ToDateTime(faDate.Year, faDate.Month, faDate.Day, faDate.Hour, faDate.Minute, faDate.Second, faDate.Millisecond);
}
}
}
Upvotes: 1