2015-05-22 79 views
4

如何將佛教格式的日期時間轉換爲格式(例如泰國2558 - > 2015)?泰國年2558至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年5月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號碼默認情況下,「DateTime」是公曆日曆。甚至[文檔](https://msdn.microsoft.com/en-us/library/system.datetime.aspx)說; _日期時間值類型表示日期和時間,值從00:00:00(午夜),0001年1月1日Anno Domini(共同時代)到公元9999年12月31日11:59:59 PM中的日期和時間, * Gregorian calendar **。這個'DateTime.Now.ToString(「yyyy-MM-dd」,new 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作爲格式提供者,就像SonerGönül在his answer末尾提示的那樣。

然而,嘗試調整DateTime使其Year屬性會顯示2558,而不是2015

即使DateTime未對存儲日期使用特定日曆,它的屬性始終會根據公曆日曆給出日期和時間部分。這導致了以下內容:

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