首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >DateTime.ToString(“yyyy.m.dd-hh_mm_ss”)只在某些日本笔记本上导致不正确的‘年份’组件。

DateTime.ToString(“yyyy.m.dd-hh_mm_ss”)只在某些日本笔记本上导致不正确的‘年份’组件。
EN

Stack Overflow用户
提问于 2021-08-06 06:41:13
回答 3查看 407关注 0票数 2

我们有一个WPF应用程序,供世界各地的用户使用。代码中有下面的日期对话。

代码语言:javascript
复制
DateTime dt = <some date time value>;

var formattedDateTime = (dt.ToString("yyyy.MM.dd-HH_mm_ss"));

这句话是给出了不正确的结果,在一些日本笔记本电脑与日本的文化集。

例如,如果dt值为{2019/09/11 14:42:47}:

  • 几台日本笔记本电脑的“formattedDateTime”输出: 01.09.11-14_42_47
  • 所有其他文化中的“formattedDateTime”输出: 2019.09.11-14_42_47

我认为这些笔记本电脑上的一些日本文化设置导致了这个问题。但我搞不清那是什么场景。另外,我认为将CultureInfo.InvariantCulture添加到DateTime.ToString()可以解决这个问题。

你知道是什么环境导致了这个问题吗?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2021-08-06 07:32:05

从你所说的,在某些机器上,日本文化默认使用日本历法而不是公历

日本历法使用基于天皇统治的时代,因此:

  • 昭和(昭和)从1926/12/25 - 1989/01/07
  • 黑塞(平成)从1989/01/08至2019/04/30
  • Reiwa (令和)将于2019年/05/01-至今

我们可以在代码中测试这一点:

代码语言:javascript
复制
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));

你在这里的选择是:

  1. 按照Robyn的建议,让用户将他们的OS日历设置更改为Gregorian (用户当前的设置将是和暦--日本日历--需要更改为西暦--西方日历)。

  1. 使用不变区域性显式格式化日期:
代码语言:javascript
复制
string myDateString = DateTime.Now.ToString("yyyy/MM/dd", CultureInfo.InvariantCulture);
  1. 在启动时,强制使用公历的区域性。请注意,使用此选项,其他代码可以在稍后执行程序时自由地更改“当前”区域性。
代码语言:javascript
复制
CultureInfo ci = (CultureInfo)CultureInfo.CurrentCulture.Clone();
ci.DateTimeFormat.Calendar = new GregorianCalendar();
CultureInfo.CurrentCulture = ci;
CultureInfo.CurrentUICulture = ci;
  1. 创建环绕ToString功能的包装器方法,并在当前日历不是Gregorian的情况下添加纪元:
代码语言:javascript
复制
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。

票数 2
EN

Stack Overflow用户

发布于 2021-08-06 07:23:36

有些用户的Windows日期格式设置为使用日本日历,2019年是Reiwa时代的第一年。它们可以通过进入Windows控制面板并将其日期格式更改为显示公历年的选项之一("ggy“而不是"y")来解决您的问题,或者将其日历类型从日文改为公历。

票数 3
EN

Stack Overflow用户

发布于 2021-08-06 06:48:04

代码语言:javascript
复制
const string culture = "ja-JP";
CultureInfo info = new CultureInfo(culture);
var formattedDateTime = (dt.ToString("yyyy.MM.dd-HH_mm_ss" , info));
票数 -2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/68677222

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档