2015-05-22 3 views
4

Как преобразовать формат datetime в datetime в gregorian формате (например, для Таиланда 2558 -> 2015)?Thai Year 2558 To 2015

using System.Text; 
using System.Threading; 
using System.Threading.Tasks; 

namespace ThailandBuddhistCalendarTest 
{ 
    class Program 
    { 
     private const string DateFormat = "yyyy-MM-dd"; 
     private const string DateTimeOffsetFormat = "yyyy-MM-dd'T'HH:mm:sszzz"; 

     static void Main(string[] args) 
     { 
      var ci = new CultureInfo("th-TH"); 
      var today = DateTime.Now.ToString(DateFormat, ci); // today == "2558-05-22" 
     } 
    } 
} 
+0

К сожалению, в настоящее время является 2558-05-22 – user3738277

ответ

1

DateTime.Now генерирует местное время с GregorianCalender по умолчанию. Если вы хотите создать это время в своем ThaiBuddhistCalendar, вы можете получить его значения с экземпляром этого объекта календаря.

Теперь вы можете использовать эти значения в DateTime(Int32, Int32, Int32, Int32, Int32, Int32) constructor для генерации DateTime.

После этого вы можете отформатировать DateTime с определенным форматом.

var now = DateTime.Now; 
int thaiYear = new ThaiBuddhistCalendar().GetYear(now); 
int thaiMonth = new ThaiBuddhistCalendar().GetMonth(now); 
int thaiDay = new ThaiBuddhistCalendar().GetDayOfMonth(now); 
int thaiHour = new ThaiBuddhistCalendar().GetHour(now); 
int thaiMinute = new ThaiBuddhistCalendar().GetMinute(now); 
int thaiSecond = new ThaiBuddhistCalendar().GetSecond(now); 

var thaiDateTime = new DateTime(thaiYear, thaiMonth, thaiDay, thaiHour, thaiMinute, thaiSecond); 
Console.WriteLine(thaiDateTime.ToString("yyyy-MM-dd")); 

Результат будет;

2558-05-22 

От http://www.thaiworldview.com/feast/feast.htm

Существует разница в 543 лет между календарем буддистской и григорианского календаря. Год 2015 в Европе составляет 2558 в Таиланде.

Если вы ищете наоборот, просто использовать культуру, которые имеют григорианский календарь, как Calender части, как InvariantCulture.

var today = DateTime.Now.ToString(DateFormat, CultureInfo.InvariantCulture)); // 2015-05-22 
+0

'DateTime' не зависит от любого календаря. Вызов 'DateTime.Now.ToString (« yyyy-MM-dd », новый CultureInfo (« th-TH »)) приводит к« 2558-05-22 ». – abto

+0

@abto No. По умолчанию используется 'DateTime' по умолчанию значение Gregorian Calender. Даже [документация] (https://msdn.microsoft.com/en-us/library/system.datetime.aspx) говорит; Тип даты DateTime представляет даты и время со значениями от 00:00:00 (полночь), 1 января 0001 года Anno Domini (Common Era) до 11:59:59 PM, 31 декабря 9999 года нашей эры (CE) в * * Григорианский календарь ** ._ Этот 'DateTime.Now.ToString (« yyyy-MM-dd », новый CultureInfo (« th-TH »))' генерирует '2558-05-22', потому что культура' th-TH' имеет 'ThaiBuddhistCalendar' как свойство' DateTimeFormatInfo.Calender'. –

+0

Это означает, что это действительно в этом диапазоне григорианского календаря. Дата 2015-05-22 (Григорианский календарь) совпадает с 2558-05-22 (календарь тайских буддистов), это только другое представление. Вы можете проверить это, сравнив 'gregorianCalendar.ToDateTime (2015,5,22,0,0,0,0)' с 'buddhistCalendar.ToDateTime (2558,5,22,0,0,0,0)'. – abto

1

Посмотрите на класс ThaiBuddhistCalendar.

В примере, если вы знаете тайский год, вы можете сделать это:

ThaiBuddhistCalendar cal = new ThaiBuddhistCalendar(); 
cal.ToDateTime(2558, 2, 1, 0, 0, 0, 0); 
.ToString("yyyy-MM-dd") // returns 2015-01-01 

Если вам необходимо получить тайские DateTime, вы можете сделать это:

ThaiBuddhistCalendar cal = new ThaiBuddhistCalendar(); 
DateTime now = DateTime.Now; 
DateTime thai = new DateTime(cal.GetYear(now), cal.GetMonth(now), now.Day); 
1

Простой ответ на свой вопрос используется Culture, который использует GregorianCalendar в качестве поставщика форматов, так же как Soner Gönül предлагает в конце his answer.

Однако не пытаться настроить DateTime так, что его свойство Year бы показать 2558 вместо 2015.

Даже если DateTime не использует определенный календарь для сохраненной даты, его свойства всегда предоставляют детали даты и времени, основанные на gregorian календаре. Это приводит к следующему:

buddhistCalendar.ToDateTime(2558,5,22,0,0,0,0) != new DateTime(2558,5,22,0,0,0,0) 

но:

buddhistCalendar.ToDateTime(2558,5,22,0,0,0,0) == new DateTime(2015,5,22,0,0,0,0) 

Если вы хотите получить год, или любое другое значение, заданного DateTime определенного календаря, а затем использовать соответствующую форму метода, который календарь как calendar.GetYear(dateTime).

В противном случае вы получите

new DateTime(2558,5,22,0,0,0,0).Year == 2558 

но:

buddhistCalendar.GetYear(new DateTime(2558,5,22,0,0,0,0)) == 3101 

 Смежные вопросы

  • Нет связанных вопросов^_^