C# 以区域性中性格式+C存储日期时间
我通过日期选择器接受用户提供的日期信息。我需要以文化中立的方式存储它们。我面临的问题是,如果我根据日历设置按照en-US格式存储日期,即1990年11月20日,当区域性为en-GB时,它将无法解析 反之亦然,当区域性为en US时,日期按英国格式存储,dd/mm/yyyy拒绝解析。我如何在文件中以文化中立的方式存储日期信息,以便在两个位置都获得工作日期C# 以区域性中性格式+C存储日期时间,c#,.net,date,datetime,datepicker,C#,.net,Date,Datetime,Datepicker,我通过日期选择器接受用户提供的日期信息。我需要以文化中立的方式存储它们。我面临的问题是,如果我根据日历设置按照en-US格式存储日期,即1990年11月20日,当区域性为en-GB时,它将无法解析 反之亦然,当区域性为en US时,日期按英国格式存储,dd/mm/yyyy拒绝解析。我如何在文件中以文化中立的方式存储日期信息,以便在两个位置都获得工作日期 DateTime.TryParse(userEnteredValue, out result); result.ToShortDateStrin
DateTime.TryParse(userEnteredValue, out result);
result.ToShortDateString(); //this is what I am doing
尝试使用此代码进行固定区域性
string input = "20/10/1983";
DateTime userInput;
bool result = DateTime.TryParse(input, out userInput);
string invariantCulture = userInput.Date.ToString(CultureInfo.InvariantCulture);
DateTime storedValue;
result = DateTime.TryParse(invariantCulture, out storedValue);
使用en GB日历设置尝试此代码,第二条语句DateTime.TryParse无效
如果我按照en US格式存储日期
请停下来!看起来您试图用日期时间值的字符串表示形式保存日期时间值
A没有任何隐式格式。它只有日期和时间值。它们的字符串表示形式可以有一个格式。生成insert查询并使用直接传递日期时间值
请阅读
如果您想以特定格式获取日期时间值的字符串表示形式,您可以始终使用方法及其重载
您的en-GB区域性可以解析MM.dd.yyyy,因为您使用的是替换其自身提供的区域性,而en-US区域性也可以解析MM/dd/yyyy
但由于您使用了.ToShortDateString方法,因此它表示基于设置的日期时间。作为一种解决方案,您可以设置此属性,使其成为所需的区域性,ToSortDateString将基于此属性工作
使用en-UK日历设置尝试此代码,第二个语句
DateTime.TryParse无法生效
因为这个DateTime.TryParse使用您的CurrentCulture,而且您的invariantCulture变量是10/20/1983 00:00:00,这意味着这不是CurrentCulture的标准日期和时间格式
顺便说一句,英国没有这样的文化
1983年10月20日00:00:00是MM/dd/yyyy HH:MM:ss格式。但是en GB区域性没有将此格式作为标准日期和时间格式,这就是为什么您的方法返回false
或者,您可以使用自定义格式字符串,如
string s = "10/20/1983 00:00:00";
string format = "MM/dd/yyyy HH:mm:ss";
DateTime dt;
if (DateTime.TryParseExact(s, format, CultureInfo.GetCultureInfo("en-GB"),
DateTimeStyles.None, out dt))
{
Console.WriteLine(dt);
}
澳大利亚英语:24/11/2001
印度英语:24-11-2001
南非英语:2001/11/24
英语美国:11/24/2001
我想你更喜欢英语印度英语
但是,如果在将日期转换为字符串(反之亦然)时确实无法决定要使用哪种区域性,并且日期永远不会显示给用户,则可以使用不变区域性:
String s = "11/24/2001" //invariant culture formatted date
d = DateTime.Parse(s, CultureInfo.InvariantCulture); //parse invariant culture date
s = d.ToString(CultureInfo.InvariantCulture); //convert to invariant culture string
@如果要将日期保存到数据库中,Soner Gönül的答案是正确的。但是,您提到您正在寻找往返于文件的日期时间 由于该文件可能是一个文本文件,因此您需要以与区域性无关的方式编写日期时间。可以使用DateTime.ToString方法上指定的。这将输出符合ISO 8601的字符串表示形式。可以使用DateTime.Parse解析结果字符串,而不需要区域性信息 例如:
string filename = @"c:\temp\test.txt";
string usDateString = "11/18/2014 12:32"; // MM/dd/yyyy
string ukDateString = "18/11/2014 12:33"; // dd/MM/yyyy
//I'm mimicking you getting the DateTime from the user here
//I'm assuming when you receive the date(s) from the front
//end you'll know the culture - if not then all bets are off.
DateTime usDate =
DateTime.Parse(usDateString, CultureInfo.GetCultureInfo("en-US"));
DateTime ukDate =
DateTime.Parse(ukDateString, CultureInfo.GetCultureInfo("en-GB"));
//write the dates to a file using the "o" specifier
File.AppendAllText(filename, usDate.ToString("o") + Environment.NewLine);
File.AppendAllText(filename, ukDate.ToString("o") + Environment.NewLine);
//read them back in as strings
string[] contents = File.ReadAllLines(filename);
foreach (var date in contents)
{
//prove we can parse them as dates.
Console.WriteLine(DateTime.Parse(date).ToString());
}
这将创建一个包含以下内容的文件:
2014-11-18T12:32:00.0000000
2014-11-18T12:33:00.0000000
在我在英国的系统上打印:
2014年11月18日12:32:00
2014年11月18日12:33:00
我试图通过这种方法找出解决方案,请让我知道它是否正确 我使用的代码如下 为了保存日期时间,我使用下面的记号
DateTime userInput;
bool result = DateTime.TryParse(this.dpSave.Text, out userInput);
if (result)
{
long ticks = userInput.Ticks;
System.IO.File.WriteAllText(@"D:\folder\Ticks.txt", ticks.ToString());
}
else
{
MessageBox.Show("Date time parse failed");
}
我使用
if (System.IO.File.Exists(@"D:\folder\Ticks.txt"))
{
string contents = System.IO.File.ReadAllText(@"D:\Sandeep\Ticks.txt");
long ticks;
if (long.TryParse(contents, out ticks))
{
DateTime storedDateTime = new DateTime(ticks);
MessageBox.Show("Stored Date" + storedDateTime.ToShortDateString());
}
else
{
MessageBox.Show("Unable to obtain stored dates");
}
}
如果我使用en-US区域性保存并使用en-GB区域性加载,这似乎是可行的
请让我知道这是否是正确的方法 交换数据应始终存储在xml等文件中 B你得小心术语。 你的确切意思是文化不变,而不是“文化中立”。 有三种类型的文化: 1不变量 2文化中性,例如en
3特定文化例如en US我偶然遇到了这个问题,我想我会引入一些其他的方式,没有人提到过: 用于序列化和反序列化 它们的作用如下: ToBinary返回一个long,它可以很容易地以区域性不变的方式存储。 FromBinaryInt64将从提供的长参数返回DateTime对象。 他们甚至考虑了日期时间类属性 下面是一些代码:
DateTime d1l = DateTime.Now;
long dl = d1l.ToBinary();
DateTime d2l = DateTime.FromBinary(dl);
DateTime d1u = DateTime.UtcNow;
long du = d1u.ToBinary();
DateTime d2u = DateTime.FromBinary(du);
Console.WriteLine("Local test passed: " + (d1l == d2l).ToString());
Console.WriteLine("d2l kind: " + d2l.Kind.ToString());
Console.WriteLine("Utc test passed: " + (d1u == d2u).ToString());
Console.WriteLine("d2u kind: " + d2u.Kind.ToString());
和控制台输出:
Local test passed: True
d2l kind: Local
Utc test passed: True
d2u kind: Utc
我觉得这个很整洁
public DateTime getdate3()
{
CultureInfo Invc = CultureInfo.InvariantCulture; //culture
string cul = Thread.CurrentThread.CurrentCulture.Name;
CultureInfo us = new CultureInfo(cul);
string shortUsDateFormatString = us.DateTimeFormat.ShortDatePattern;//pattern
DateTime dt = Convert.ToDateTime(DateTime.Now);
TimeZoneInfo myZone = TimeZoneInfo.FindSystemTimeZoneById("India Standard Time"); //india zone
DateTime dateindia = TimeZoneInfo.ConvertTime(dt, myZone);
string dt1 = Convert.ToDateTime(dateindia).ToString(shortUsDateFormatString); //string format
}好的,我只是在执行DateTime.TryParseDateTime.tryparseurenteredvalue,out result之后保存字符串表示形式;result.toSortDateString;这就是我doing@Sandepku您的userEnteredValue和CurrentCulture的值是什么?用户输入的值可以是20/10/1983&CurrentCulture-en GB或10/20/1983&CurrentCulture-en-US日期可以以en GB格式保存,以后用户可以将日历设置更改为en US格式。我无法明确指定whi
中国文化。我试图编写独立于文化的代码。如果我错了,请更正。如果我在示例代码中将输入日期修改为2001年11月24日,该怎么办?我怀疑它能解析。检查一下我不知道文化信息,因为我不知道安装在哪里,可能是美国/英国地区。问题是,美国用户可能会以英国格式输入日期,反之亦然,或者一旦以英国格式存储日期,英国用户可能会更改日历设置以指向en-US@Sandepku-据我所知,这里有两个独立的问题。第一个是当你从用户那里收到一个日期时,你需要把它解析成一个日期时间——为此,你必须了解文化。第二个问题是希望将日期持久化到文件中。为此,您可以使用我上面的代码,它将安全地往返于任何用户文化。@sandpku-那么您总是知道原始用户输入的文化吗?如果是这样的话,那么上面的方法可以在文本文件中持久化日期。不,我不知道,我只是按照当前的文化进行分析。我添加了一种方法,你能让我知道这是好的还是有缺陷吗?没有所谓的英国文化。我真的没有看到任何评论或更新后张贴我的方法建议。因此,接受这个答案。如果你能在你的答案中添加解释,将会提高理解力
Local test passed: True
d2l kind: Local
Utc test passed: True
d2u kind: Utc
public DateTime getdate3()
{
CultureInfo Invc = CultureInfo.InvariantCulture; //culture
string cul = Thread.CurrentThread.CurrentCulture.Name;
CultureInfo us = new CultureInfo(cul);
string shortUsDateFormatString = us.DateTimeFormat.ShortDatePattern;//pattern
DateTime dt = Convert.ToDateTime(DateTime.Now);
TimeZoneInfo myZone = TimeZoneInfo.FindSystemTimeZoneById("India Standard Time"); //india zone
DateTime dateindia = TimeZoneInfo.ConvertTime(dt, myZone);
string dt1 = Convert.ToDateTime(dateindia).ToString(shortUsDateFormatString); //string format