【问题标题】:WP7 DAteTime different localesWP7 DateTime 不同的语言环境
【发布时间】:2011-08-13 05:58:40
【问题描述】:

我一直在编写一个 WP7 应用程序,部分功能涉及使用 DateTime 值。该值也存储(在 Sterling 数据库中)。

我试图在日期和我需要展示它的地方避开不同的文化价值观,我这样做是使用我自己的格式。我从不“摆弄” DateTime 本身。

在运行英语(新西兰语言环境)的 PC 上,模拟器一切正常

但是在电话本身上,事情被搞砸了,因为日期和月份都被搞砸了。现在已经意识到电话上的语言环境是英语(美国),但区域格式是英语(新西兰)。已将两者都更改为英语(美国),电话上一切正常。

所以我的问题是

1/ 我是否需要考虑不同的语言环境和地区

2/ 是否有一种简单的方法可以确保不会发生此问题?

我的代码如下

如下定义的属性

 public const string NextDateTimePropertyName = "NextDateTime";
    private DateTime _nextDateTime;
    public DateTime NextDateTime
    {
        get
        {
            return _nextDateTime;
        }
        set
        {
            if (_nextDateTime != value)
            {

                _nextDateTime = value;
                RaisePropertyChanged(NextDateTimePropertyName);

            }
        }

    }

显示日期的绑定如下 TextBlock Text="{Binding DateTimeDayString}"

我的班级帽子上的一个属性映射到绑定

 public string DateTimeDayString
    {

        get
        {
            return NextDateTime.ToString("dddd MMM d");
        }

    }

当电话区域设置和区域是同一个国家时,一切正常,但是当区域设置和区域不同时,即区域设置英语 - 英国和英语 - 美国然后 输入的 8 月 9 日将显示为“9 月 8 日星期四”

我意识到拥有不同的语言环境和地区是一种不寻常的设置。但我想看看我如何保护自己免受这种情况的影响。

通过 DatePicker 控件选择日期

x:Name="datePicker"  Value="{Binding EventDate, Mode=TwoWay, UpdateSourceTrigger=Explicit}"
                 ValueChanged="datePicker_ValueChanged" ValueStringFormat="{}{0:D}"   Margin="22,87,91,0" 

在视图模型中具有如下属性

 private DateTime _EventDateTime;
    public DateTime EventDateTime
    {

        get
        {
            return _EventDateTime;
        }

        set
        {
            if (value != null)
            {
                _EventDateTime = value;

            }


        }


    }

当我存储这个属性时

CurrSingleEventItem.NextDateTime = EventDate.BuildDateTime(EventTime);

还有 BuildDateTime 扩展方法(因为我也让用户通过时间选择器输入时间

 public static DateTime BuildDateTime(this String DateString, String time)
    {


        DateTime dt = System.Convert.ToDateTime(DateString);
        DateTime timedt = System.Convert.ToDateTime(time);
        string timestr = timedt.ToString("H:mm");
        DateTime newDt = System.Convert.ToDateTime(dt.ToLongDateString() + " "  + timestr + ":00");
        return newDt;

    }
  • 谢谢 - 彼得

【问题讨论】:

    标签: datetime windows-phone-7 culture


    【解决方案1】:

    您还没有真正说出问题所在 - “日期和月份被搞砸了”并不是很准确。如果区域格式设置为新西兰并且您看到日期格式为 dd/MM/yyyy,这对我来说似乎是完全合理的 - 这是来自新西兰(或英国,或美国以外的大多数地方的人... ) 可能会期望。

    至于您是否需要允许不同的语言环境和地区 - 这完全是您的事。您是否希望该应用程序在多个国家/地区使用?如果是这样,那么您绝对应该对文化敏感。

    至于您的第二个问题:首先根本不清楚是否存在“问题”。如果日期只是简单地以新西兰风格格式化,我不认为这是一个问题。如果您最终以某种方式获得了损坏的数据,那就另当别论了 - 您需要提供更多详细信息。

    【讨论】:

    • 好的问题是日期和月份被调换了。我的问题是允许不同的语言环境和地区....我故意不依赖应用程序中的日期格式,而是始终以我想要的方式呈现它,但不要依赖它作为存储的数据。我只是将日期存储在 DateTime 变量中,我假设它会处理事情。在处理不同的语言环境和地区时,也许我应该说的是手机是否具有与其所在地区不同的语言环境。
    • @Peter:你说他们被转置了——但是用户想要什么?您应该按照用户 想要的方式格式化它,而不是按照 想要的方式。如果您没有任何不同文化的用户,那很好 - 但否则您需要考虑不同文化如何格式化日期。 DateTime 本身没有任何格式信息,因此您不会丢失信息。格式化由与文化关联的DateFormatInfo 处理。如果您真的想强制使用特定格式,当然可以这样做。
    • 乔恩...我提出的格式是与文化无关的。它是一种稍微不同的格式,它比 dd/mm/yy 更通用,而不是 mm/dd/yy。我知道不同文化的日期。格式化我发布的日期没有问题。我非常了解文化特定的东西。我曾预计 DateTime 会按照您的建议工作(没有格式信息),因此只要我知道我如何呈现我的日期,我就可以了。我发现,当手机设置为与区域不同的本地时,它无法按我的预期工作。
    • 当区域设置和区域匹配时,一切正常。当它们不同时,我就会遇到问题。
    • @Peter:如果您想使用与文化无关的格式,那么只需明确指定即可。你还没有真正解释你想要做什么,或者此刻正在发生什么......如果你能展示一些代码,实际输出和预期输出,那真的很有帮助......
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-13
    相关资源
    最近更新 更多