我们有一个WPF应用程序,供世界各地的用户使用。代码中有下面的日期对话。
DateTime dt = <some date time value>;
var formattedDateTime = (dt.ToString("yyyy.MM.dd-HH_mm_ss"));这句话是给出了不正确的结果,在一些日本笔记本电脑与日本的文化集。
例如,如果dt值为{2019/09/11 14:42:47}:
我认为这些笔记本电脑上的一些日本文化设置导致了这个问题。但我搞不清那是什么场景。另外,我认为将CultureInfo.InvariantCulture添加到DateTime.ToString()可以解决这个问题。
你知道是什么环境导致了这个问题吗?
发布于 2021-08-06 07:32:05
从你所说的,在某些机器上,日本文化默认使用日本历法而不是公历。
日本历法使用基于天皇统治的时代,因此:
我们可以在代码中测试这一点:
var jpCulture = new CultureInfo("ja-jp");
jpCulture.DateTimeFormat.Calendar = new JapaneseCalendar();
// output: 昭和 63/05/11
Console.WriteLine(new DateTime(1988, 05, 11).ToString("g yyyy/MM/dd", jpCulture));
// output: 平成 20/05/11
Console.WriteLine(new DateTime(2008, 05, 11).ToString("g yyyy/MM/dd", jpCulture));
// output: 平成 31/04/30
Console.WriteLine(new DateTime(2019, 04, 30).ToString("g yyyy/MM/dd", jpCulture));
// output: 令和 01/05/01
Console.WriteLine(new DateTime(2019, 05, 01).ToString("g yyyy/MM/dd", jpCulture));你在这里的选择是:

string myDateString = DateTime.Now.ToString("yyyy/MM/dd", CultureInfo.InvariantCulture);CultureInfo ci = (CultureInfo)CultureInfo.CurrentCulture.Clone();
ci.DateTimeFormat.Calendar = new GregorianCalendar();
CultureInfo.CurrentCulture = ci;
CultureInfo.CurrentUICulture = ci;ToString功能的包装器方法,并在当前日历不是Gregorian的情况下添加纪元:public static class DateTimeExtensions
{
public static string ToStringYMDWithEra(this DateTime dt)
{
string formatString = (CultureInfo.CurrentCulture.Calendar is GregorianCalendar)
? "yyyy/MM/dd"
: "gyyyy/MM/dd";
return dt.ToString(formatString);
}
}用法:string formattedDate = DateTime.Now.ToStringYMDWithEra();
请注意,日本用户将含蓄地理解带有时代的日文日历。从表格到医生注册到任何官方的东西都使用日本的日历系统。例如,我的驾驶执照将我的出生年份(1988年)定为昭和63。
发布于 2021-08-06 07:23:36
有些用户的Windows日期格式设置为使用日本日历,2019年是Reiwa时代的第一年。它们可以通过进入Windows控制面板并将其日期格式更改为显示公历年的选项之一("ggy“而不是"y")来解决您的问题,或者将其日历类型从日文改为公历。
发布于 2021-08-06 06:48:04
const string culture = "ja-JP";
CultureInfo info = new CultureInfo(culture);
var formattedDateTime = (dt.ToString("yyyy.MM.dd-HH_mm_ss" , info));https://stackoverflow.com/questions/68677222
复制相似问题