如何将两个字符串(日期和时间)合并为一个DateTime?

15

我有两个字符串:

string one = "13/02/09";
string two = "2:35:10 PM";

我想将这两个内容合并在一起并转换为DateTime

我尝试了以下方法,但它没有起作用:

DateTime dt = Convert.ToDateTime(one + " " + two);
DateTime dt1 = DateTime.ParseExact(one + " " + two, "dd/MM/yy HH:mm:ss tt", CultureInfo.InvariantCulture);

我该做些什么才能让这个工作起来?


2
抛出了什么异常? - tschmit007
2
考虑将日期和时间分别解析为 DateTime 对象,然后组合这些组件。如果不够小心地解析连接字符串,则可能会导致问题。 - Jeff Mercado
9个回答

16

试试这样做;

string one = "13/02/09";
string two = "2:35:10 PM";

DateTime dt = Convert.ToDateTime(one + " " + two);
DateTime dt1 = DateTime.ParseExact(one + " " + two, "dd/MM/yy h:mm:ss tt", CultureInfo.InvariantCulture);

Console.WriteLine(dt1);

这里是一个DEMO

使用24小时制的HH,表示时间范围为0023。例如,1:45:30 AM -> 011:45:30 PM -> 13

使用12小时制的h,表示时间范围为1到12。例如,1:45:30 AM -> 11:45:30 PM -> 1

查看更多信息,请参阅自定义日期和时间格式字符串


3

你的问题出在时间格式上;你需要使用h使用12小时制表示小时,范围为1到12),而不是HH使用24小时制表示小时,范围为00到23)。


3

我有不同的格式,上面的答案不起作用:

string one = "2019-02-06";
string two = "18:30";

这种格式的解决方案是:
DateTime newDateTime = Convert.ToDateTime(one).Add(TimeSpan.Parse(two));

结果将是: newDateTime{06-02-2019 18:30:00}。

2

尝试使用与您的字符串值的DateTime格式匹配的区域设置:

DateTime dt = Convert.ToDateTime(one + " " + two,
    CultureInfo.GetCultureInfo("ro-RO"));

或者修改输入字符串,使小时数有2位数字:

string one = "13/02/09";
string two = "02:35:10 PM";
DateTime dt1 = DateTime.ParseExact(one + " " + two, 
    "dd/MM/yy HH:mm:ss tt",
    CultureInfo.InvariantCulture);

它仍然抛出异常。 - Matthew Watson
@MatthewWatson,你确定吗?你真的测试过了吗? - Alex Filipovici
1
抱歉,是我的错误!我尝试了一下,但我可能粘贴了错误的代码!加个赞 ;) - Matthew Watson

1
问题在于您指定的格式字符串不正确。
“HH”表示两位数字的小时,但您只有一个数字的小时。
请使用“h”。
因此,完整的格式为“dd/MM/yy h:mm:ss tt”。

1
当您指定确切的格式字符串并且其中没有文本(例如日期名称)时,提供的区域设置影响不大 - 我不确定它在这里有任何影响。 - Rawling

0

使用 string two = "02:35:10 PM"; 代替 string two = "2:35:10 PM";,并且由于 AM/PM 格式,使用 hh 而不是 HH

以下是代码:

string one = "13/02/09";
string two = "02:35:10 PM";

DateTime dateTime = DateTime.ParseExact(one + " " + two, "dd/MM/yy hh:mm:ss tt", CultureInfo.InvariantCulture);

1
这需要 OP 对他的输入有控制权,但这可能并不是情况。为什么要求他更改输入,而不是通过正确地更改格式字符串来解决这个问题呢? - Rawling
我已经删除了它,实际上我已经为你的答案点赞了!(我在回复不同的答案时出现了一些手指错误,我想是因为我的互联网连接有点问题。对于造成的混淆我感到抱歉。) - Matthew Watson
@Rawling:如果他手头的输入值长度各异,并且它们前面没有0,而且他无法修复这种输入格式,那么他可以尝试找到另一种解决方案。这个方法并非所有情况下都是万灵药。 - Ryszard Dżegan
@Matthew Watson:现在可以了 :) - Ryszard Dżegan
1
@yBee 不,如果他得到的是没有前导0的各种长度的值,他可以使用正确的格式说明符h,而不是用另一个错误的说明符hh来替换一个错误的说明符HH - Rawling
@Rawling:我同意,你的解决方案更通用。 - Ryszard Dżegan

0
以下代码可以实现您想要的功能。我使用了英国文化来处理日期的d/m/y结构:
        string string1 = "13/2/09";
        string string2 = "2:35:10 PM";
        DateTime combined = DateTime.Parse(string1 + ' ' + string2, new CultureInfo("UK"));

0

Convert.ToDateTime 使用当前线程的区域设置来调用 DateTime.ParseExact,因此您可以通过简单地执行以下操作使事情更加清晰:

string date = "13/02/09";
string time = "2:35:10 PM";
DateTime dateTime = DateTime.Parse(date +" "+ time, new CultureInfo("en-GB"));
Console.WriteLine (dateTime);

这将返回结果13/02/2009 14:35:10,并强制解析使用en-GB日期时间格式。如果您的Windows安装本来就是en-GB,那么您不需要CultureInfo(..)参数。


-1
使用DateTime.Parse()将日期和时间分开进行解析,然后将第二个时间的时间组件添加到第一个时间中,如下所示。
var date = DateTime.Parse (one);
var time = DateTime.Parse (two);
var result = date + time - time.Date;

无法工作,出现错误:运算符“+”不能应用于类型为“System.DateTime”和“System.DateTime”的操作数。 - MSTdev

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接