我想尝试将日期时间转换为字符串并返回,但要使其适用于所有文化.
我基本上有一个Textbox(tbDateTime)和一个标签(lbDateTime).标签告诉用户软件期望输入tbDateTime的格式.Textbox的输入将用于MySQL命令.
目前它的工作原理如下:
lbDateTime.Text = "DD.MM.YYYY hh:mm:ss"; // I live in germany
DateTime date = Convert.ToDateTime(tbDateTime.Text);
String filter = date.ToString("yyyy-MM-dd HH:mm:ss");
Run Code Online (Sandbox Code Playgroud)
现在我的问题:
我希望你能帮助我.我实际上没有电脑来测试不同的文化,所以我非常害怕我做错了什么.
正如标题所说,我遇到的问题是我需要使用短月份名称格式和年份,日期由AjaxControlToolkit中的MaskedEditExtender验证.DateTime的MMM-yyyy与MaskedEditExtender.Mask ="LLL-9999"不同.
如果我使用en-US语言环境,那就像魅力一样,但是如果我切换到fr-FR那么它将无法工作,因为法语中的短月表示使用4到5个字母(包括点).
有什么想法吗?谢谢.
设计一个独立于文化的生日输入,包括三个选择:年,月和日.
在.NET中,如何为给定的文化获得三者的正确显示顺序,即:
????????????????? ?????????????????? ????????????????
? Select year ?v? ? Select month ?v? ? Select day ?v?
????????????????? ?????????????????? ????????????????
????????????????? ?????????????????? ????????????????
? Select day ?v? ? Select month ?v? ? Select year?v?
????????????????? ?????????????????? ????????????????
Run Code Online (Sandbox Code Playgroud)
要么
????????????????? ?????????????????? ????????????????
? Select month?v? ? Select day ?v? ? Select year?v?
????????????????? ?????????????????? ????????????????
Run Code Online (Sandbox Code Playgroud)
*更新* 感谢大家的回答,这让我想出了这个小功能:
Public Function GetDateElementAtPos(ByVal pos As Integer) As String
Return Mid(Me.myCultureInfo.DateTimeFormat.ShortDatePattern.Split(Me.myCultureInfo.DateTimeFormat.DateSeparator)(pos), 1, 1).ToLower
End Function
Run Code Online (Sandbox Code Playgroud)
其中myCultureInfo代表初始化Globalization.CultureInfo.我这样使用它:
Dim s as new stringbuilder …Run Code Online (Sandbox Code Playgroud) 使用不合适InvariantCulture吗?并且,如果使用,它会影响任何全局设置吗?
Dim hh As Decimal = 123456789.123456
' Is this an appropriate usage?
Dim ll As String = hh.ToString("N4", CultureInfo.InvariantCulture)
Run Code Online (Sandbox Code Playgroud) 我试图设置ASP.NET应用程序的Culture和UICulture但没有成功.也在C#Windows应用程序中尝试过.
System.Globalization.CultureInfo a = new System.Globalization.CultureInfo("fa-IR");
a.NumberFormat.DigitSubstitution = System.Globalization.DigitShapes.NativeNational;
string Q = string.Format(a, "{0}", 1234567890); // Output 1234567890 instead of ??????????
Run Code Online (Sandbox Code Playgroud)
我在代码中遗漏了哪些部分?
我有一个写下这样日期的网站:
CultureInfo cultureInfo = CultureInfo.GetCultures(CultureTypes.AllCultures).FirstOrDefault(c => string.Equals(c.TwoLetterISOLanguageName, MvcApplication.Language));
return string.Concat(date.Day, ".", cultureInfo.DateTimeFormat.GetAbbreviatedMonthName(date.Month));
Run Code Online (Sandbox Code Playgroud)
在这两个我的电脑(Windows 7的Service Pack 1起,西班牙文化)和服务器(Windows Server 2012中,英文化)的MvcApplication.Language是es让我从列表中得到文化是:es-ES.
我希望他们都写相同的字符串(他们有不同的文化,但我没有使用CurrentCulture).但结果是abr在我的电脑和Abr.服务器中.
我试过这个与MvcApplication.Language使用LinqPAD隔离但它仍然不同.我已经打印了各种计算机的数组,AbbreviatedDayNames并且AbbreviatedMonthNames它们各不相同.
我做错了什么或这是预期的行为?如何使其完全独立于Windows /用户文化?
我需要从浏览器的语言中获取文化字符串。
我考虑过从javascript这样获取代码:
var userLang = navigator.language || navigator.userLanguage;
Run Code Online (Sandbox Code Playgroud)
但这只给了我从.NET获得的文化信息的第一部分:
Thread.CurrentThread.CurrentCulture.Name;
Run Code Online (Sandbox Code Playgroud)
因此,javascript为我提供了“ de”或“ pl”,而不是.NET中的“ de-DE”或“ pl-PL”。有没有办法获取“完整信息”?
在dotnet中,以文化特定方式格式化货币的推荐方法是(据我所知):
using System.Globalization
var info = CultureInfo.GetCultureInfo("en-GB")
return string.Format(info, "{0:c}", 1234.5678)
Run Code Online (Sandbox Code Playgroud)
返回:
£1,234.57
Run Code Online (Sandbox Code Playgroud)
然而.此处未给出具体货币.因此,如果英国转换为欧元,同样的方法会突然返回如下:
€ 1,234.57
Run Code Online (Sandbox Code Playgroud)
这恰好发生在拉脱维亚.今年,它转换为欧元.各种系统包含letvia lats和euros两种金额.我需要能够打印和格式化旧货币.我需要确保新货币也可以处理.此格式不仅与符号有关,还与放置(前后,有或没有空格)和本地数字格式(小数分隔符和千位分隔符)有关.
我们数据库中的每个金额都有货币(例如EUR)和相应的文化(例如nl-NL).欧元金额的格式不同,具体取决于它们来自我们的德国或荷兰办事处.(他们都使用欧元,但格式不同)
现在,我能想到的唯一方法是将culture-database复制到我的数据库.
我遇到过其他开发人员编写的一些单元测试,这些测试经常使用Assert.AreEqual像这样的重载版本:
Assert.AreEqual(stringparamX, stringParamY, true, CultureInfo.InvariantCulture);
Run Code Online (Sandbox Code Playgroud)
stringParamX在单元测试中设置,并且stringparamY将是被测系统的结果.
可能会将此代码移植到其他国家/地区,并且可以执行这些测试.但是,在查看MSDN文档文档时,我不禁想到传入CultureInfo.InvariantCulture这里会增加一些不必要的复杂性.如果在其他文化中执行,我不确定它会对测试产生什么样的影响.
在我的情况下,在单元测试的上下文中,我为什么要(或不)写这样的断言?
我有一个Cloud Service Web角色,需要在其上运行一些PowerShell,以确保始终在正确的区域性中设置服务器:en-AU。
原因是Microsoft可以随时重置文化价值观。
当我跑步时:
Get-Culture
Run Code Online (Sandbox Code Playgroud)
我得到:
1033 en-US English (United States)
Run Code Online (Sandbox Code Playgroud)
因此,我运行:
Set-Culture en-AU
Run Code Online (Sandbox Code Playgroud)
但是我仍然得到:
1033 en-US English (United States)
Run Code Online (Sandbox Code Playgroud)
我尝试了很多事情,但似乎没有什么改变真正的文化。
任何帮助都会很棒。
cultureinfo ×10
c# ×6
.net ×3
asp.net ×3
culture ×2
asp.net-mvc ×1
azure ×1
currency ×1
date ×1
datetime ×1
format ×1
javascript ×1
powershell ×1
unit-testing ×1
vb.net ×1