将C#日期字符串转换为不同格式,而不首先转换为日期

将C#日期字符串转换为不同格式,而不首先转换为日期,c#,.net,C#,.net,是否可以将日期字符串从一种格式转换为另一种格式,而不实际转换为日期 我需要这样的东西: string inputDateString = "01/01/2012 23:36:17.234"; string inputFormat = "dd/MM/yyyy HH:mm:ss.fff"; string ouputFormat = "yyyy/MM/dd HH:mm:ss.fff"; string outputDateString = StringDate.Convert(inputDateStr

是否可以将日期字符串从一种格式转换为另一种格式,而不实际转换为日期

我需要这样的东西:

string inputDateString = "01/01/2012 23:36:17.234";
string inputFormat = "dd/MM/yyyy HH:mm:ss.fff";

string ouputFormat = "yyyy/MM/dd HH:mm:ss.fff";
string outputDateString = StringDate.Convert(inputDateString,inputFormat, outputFormat);
很明显,我可以编写一个StringDate类来解析格式,但这看起来像是重新发明轮子。我不能先去约会的原因是,我在时区/服务器时间方面遇到了很多问题,并且无法控制将在其中运行的环境。我只想100%确定日期字符串只是重新设置了范围,而不是弄乱了

谢谢

编辑 输出格式始终相同,但输入格式可以是以下任意组合:

时间变化: HH:mm:ss.fff HH:mm:ss 嗯

日期变化(可能更多): 年月日 年月日 年月日 年月日 yyyy/MM/dd yy/MM/dd

你应该首先解析它。您只需要注意如何解析和格式化它。仅仅因为你过去在时区方面遇到了问题,并不意味着你就应该避免解析/格式化——这意味着你应该根据时区来确定你想要做什么。听起来您只是想将数据视为本地数据。我想您可能需要指定
datetimestyle.AssumeLocal
,并使用不变区域性

使用
DateTime.ParseExact
和您期望的确切格式(以及特定区域性,可能是不变区域性),然后使用输出格式调用
ToString
,再次调用相关区域性

还要注意,您期望的格式字符串不正确-您使用的是
hh
,而您的意思是
hh
,我怀疑您想要的是
fff
,而不是
mmm
。示例代码:

using System;
using System.Globalization;

public class Test
{
    static void Main()
    {
        string inputDateString = "01/01/2012 23:36:17.234";
        string inputFormat = "dd/MM/yyyy HH:mm:ss.fff";        
        string outputFormat = "yyyy/MM/dd HH:mm:ss.fff";

        DateTime parsed = DateTime.ParseExact(inputDateString, inputFormat,
                                              CultureInfo.InvariantCulture,
                                              DateTimeStyles.AssumeLocal);
        string outputDateString = parsed.ToString(outputFormat, 
                                                  CultureInfo.InvariantCulture);
        Console.WriteLine(outputDateString); // Prints 2012/01/01 23:36:17.234
    }
}
您可能还想查看我的项目,它允许您为每个输入和输出创建一个
LocalDateTimePattern
,然后重复使用它们。

您应该首先解析它。您只需要注意如何解析和格式化它。仅仅因为你过去在时区方面遇到了问题,并不意味着你就应该避免解析/格式化——这意味着你应该根据时区来确定你想要做什么。听起来您只是想将数据视为本地数据。我想您可能需要指定
datetimestyle.AssumeLocal
,并使用不变区域性

使用
DateTime.ParseExact
和您期望的确切格式(以及特定区域性,可能是不变区域性),然后使用输出格式调用
ToString
,再次调用相关区域性

还要注意,您期望的格式字符串不正确-您使用的是
hh
,而您的意思是
hh
,我怀疑您想要的是
fff
,而不是
mmm
。示例代码:

using System;
using System.Globalization;

public class Test
{
    static void Main()
    {
        string inputDateString = "01/01/2012 23:36:17.234";
        string inputFormat = "dd/MM/yyyy HH:mm:ss.fff";        
        string outputFormat = "yyyy/MM/dd HH:mm:ss.fff";

        DateTime parsed = DateTime.ParseExact(inputDateString, inputFormat,
                                              CultureInfo.InvariantCulture,
                                              DateTimeStyles.AssumeLocal);
        string outputDateString = parsed.ToString(outputFormat, 
                                                  CultureInfo.InvariantCulture);
        Console.WriteLine(outputDateString); // Prints 2012/01/01 23:36:17.234
    }
}
您可能还想查看我的项目,这将允许您为每个输入和输出创建一个
LocalDateTimePattern
,然后重复使用它们。

这应该可以:

string inputDateString = "01/01/2012 23:36:17.234";
string inputFormat = "dd/MM/yyyy HH:mm:ss.fff";

string ouputFormat = "yyyy/MM/dd HH:mm:ss.fff";

string outputDateString = DateTime.ParseExact(inputDateString, inputFormat, System.Globalization.CultureInfo.InvariantCulture).ToString(ouputFormat);
这应该起作用:

string inputDateString = "01/01/2012 23:36:17.234";
string inputFormat = "dd/MM/yyyy HH:mm:ss.fff";

string ouputFormat = "yyyy/MM/dd HH:mm:ss.fff";

string outputDateString = DateTime.ParseExact(inputDateString, inputFormat, System.Globalization.CultureInfo.InvariantCulture).ToString(ouputFormat);

编写一个通用函数来使用不同的日期格式来实现这一点并非易事。但是,对于单个已知的输入和输出格式,它变得简单(regex或子字符串)。它将是什么?使用UTC进行所有日期时间操作,而不仅仅将其表示为客户机的日期时间,怎么样?如果你绝对确定你想要它以你描述的一种不寻常且被破坏的方式出现,为什么不使用正则表达式呢?@PaulGrimshaw:这种格式使用的是什么模式?因为它不是.NET自定义日期/时间格式,除非您真的想要秒后的月名…@JonSkeet抱歉,它应该是.NET自定义日期/时间格式,可能只是犯了一个错误…编写一个通用函数来使用不同的日期格式来实现这一点是非常重要的。但是,对于单个已知的输入和输出格式,它变得简单(regex或子字符串)。它将是什么?使用UTC进行所有日期时间操作,而不仅仅将其表示为客户机的日期时间,怎么样?如果你绝对确定你想要它以你描述的一种不寻常且被破坏的方式出现,为什么不使用正则表达式呢?@PaulGrimshaw:这种格式使用的是什么模式?因为它不是.NET自定义日期/时间格式,除非您真的想要秒后的月名…@JonSkeet抱歉,它应该是.NET自定义日期/时间格式,可能只是犯了一个错误…您还应该在输出时指定区域性。请参阅我的答案以获取示例。您还应该在输出上指定区域性。请看我的答案作为例子,绝对不是。这是在解析时忽略输入格式,然后尝试对字符串使用输出格式。绝对不是。这是在解析时忽略输入格式,然后尝试在字符串上使用输出格式。这看起来确实是前进的方向。谢谢你的帮助。与以前一样,ParseExact是关键,我对系统“猜测”的日期格式有问题。@PaulGrimshaw:绝对-启发式可能适用于用户输入的数据,但不适用于您已经知道正确格式的数据。这看起来确实是一条前进的道路。谢谢你的帮助。与以前一样,ParseExact是关键,我对系统“猜测”的日期格式有问题。@PaulGrimshaw:绝对-启发式可能适用于用户输入的数据,但不适用于您已经知道正确格式的数据。