Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/289.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 以区域性中性格式+C存储日期时间_C#_.net_Date_Datetime_Datepicker - Fatal编程技术网

C# 以区域性中性格式+C存储日期时间

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

我通过日期选择器接受用户提供的日期信息。我需要以文化中立的方式存储它们。我面临的问题是,如果我根据日历设置按照en-US格式存储日期,即1990年11月20日,当区域性为en-GB时,它将无法解析

反之亦然,当区域性为en US时,日期按英国格式存储,dd/mm/yyyy拒绝解析。我如何在文件中以文化中立的方式存储日期信息,以便在两个位置都获得工作日期

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