如果地区操作系统是泰语,如何保留日期输入的格里高利日期格式



我有一个从Excel中提取的日期字符串,我正在尝试解析它。所述日期最初为格里高利格式。即使在使用TryParse/TryParseExact之后,是否有任何方法可以保持这一点?

注意:由于我们的最终用户来自泰国,我将在我的机器所在地区设置为泰国时执行此操作。因此,我的系统日期是"12/7/2561"

假设我以格里高利M/d/yyyy格式输入以下字符串:

string validDate = "7/15/2018"

当我最初尝试使用DateTime.TryParseExact解析它时,它给了我15/7/2561

我已经尝试了这些链接中列出的以下方法,特别是CreateSpecificCulture:

  1. MSDN:将泰国日期时间转换为英语日期时间
  2. ASP.NET论坛:从泰国文化向英国文化转变的DateTime问题

这是我现在的代码:

public DateTime? ConvertThaiToGregorian(string text, string dateFormat)
{
/// Note: Thailand uses the Thai Buddhist calendar, which is 543 years ahead of 
///       the Gregorian calendar. 
/// dateFormat here is "M/d/yyyy".
DateTime convertedDate;
// Create Thai CultureInfo
IFormatProvider thCulture = CultureInfo.CreateSpecificCulture("th-TH");
// Parse date = returns "15/7/2018"...
DateTime.TryParseExact(text, dateFormat, thCulture, DateTimeStyles.None, out convertedDate);
// Create en-US CultureInfo
IFormatProvider engCulture = CultureInfo.CreateSpecificCulture("en-US");
// Parse date back to US format = gives me "01/01/0544"...
DateTime.TryParseExact(convertedDate.ToString(), dateFormat, engCulture, DateTimeStyles.None, out convertedDate);
return convertedDate;
}

任何帮助都将不胜感激。非常感谢。

希望它能帮助您了解CultureInfo是如何从字符串中获取DateTime的,最低要求是区域性日期字符串是什么,但如果字符串解析正确,服务器或操作系统应该无关紧要。只有在解析字符串时未指定区域性时,操作系统才会进行干预。

C#小提琴在这里:https://dotnetfiddle.net/wdDlts

using System;
using System.Globalization;
public class Program
{
public static void Main()
{
string thaiBudistDate = "12/7/2561";
// US format
CultureInfo provider = CultureInfo.GetCultureInfo("en-US");
DateTime date = DateTime.Parse(thaiBudistDate, provider);
Console.WriteLine("Original string: '" + provider + "' in 'en-US' => Day: " + date.Day + " Month: " + date.Month + " Year: " + date.Year );
// Thai Culture
provider = CultureInfo.GetCultureInfo("th-TH");
date = DateTime.Parse(thaiBudistDate, provider);
Console.WriteLine("Original string: '" + provider + "' in 'th-TH' => Day: " + date.Day + " Month: " + date.Month + " Year: " + date.Year );
// Thai Culture format! M/d/yyyy
provider = CultureInfo.GetCultureInfo("th-TH");
var format = "M/d/yyyy";
date = DateTime.ParseExact(thaiBudistDate, format, provider);
Console.WriteLine("Original string: '" + provider + "' in 'th-TH' format specified 'M/d/yyyy' => Day: " + date.Day + " Month: " + date.Month + " Year: " + date.Year );
// Thai Culture format d/M/yyyy 
provider = CultureInfo.GetCultureInfo("th-TH");
format = "d/M/yyyy";
date = DateTime.ParseExact(thaiBudistDate, format, provider);
Console.WriteLine("Original string: '" + provider + "' in 'th-TH' format specified 'd/M/yyyy' => Day: " + date.Day + " Month: " + date.Month + " Year: " + date.Year );
// Using Gregorian time
string usaDate = "12/7/2018";
// US Culture
provider = CultureInfo.GetCultureInfo("en-US");
date = DateTime.Parse(usaDate, provider);
Console.WriteLine("Original string: '" + usaDate + "' in 'en-Us' => Day: " + date.Day + " Month: " + date.Month + " Year: " + date.Year );

// You got the point, dones't matter what provider you use! Hope this will help you undestand how wondows Culture works
usaDate = "12/7/2018";
// Thai Culture
provider = CultureInfo.GetCultureInfo("th-TH");
date = DateTime.Parse(usaDate, provider);
Console.WriteLine("Original string: '" + usaDate + "' in 'th-TH' => Day: " + date.Day + " Month: " + date.Month + " Year: " + date.Year );
}
}

如果您已经将日期时间转换为泰国文化(其中正确设置了日期、月份和年份属性(,我认为将其再次格式化为datetime.ToString("M/d/yyyy"(就足够了,以防您想要字符串表示。

最新更新