DateTime解析 - 意外结果

时间:2017-03-24 11:34:39

标签: c#

我有日期时间字符串

dateStr = "2017-03-21T23:00:00.000Z";

然后我打电话

var date = DateTime.Parse(dateStr);

意外地我的日期等于

22.03.2017 00:00:00

我预计它将是21.03.2017 这里发生了什么?

3 个答案:

答案 0 :(得分:4)

DateTime.Parse()是特定于语言环境的,在解析日期时会考虑您的本地时区。

如果您在冬季参加CET(中欧时间),您的抵消时间比UTC早一个小时。给定的日期标有Z,表示它是UTC格式,因此DateTime.Parse()会将其调整为您当地的时区。

override允许您根据需要更改该行为,方法是指定特定的DateTimeStyles枚举。 DateTimeStyles.AdjustToUniversal正是您所寻找的,因为它应该将DateTime保持为UTC。

如果您之后只想要日期部分,则可以在.Date

返回的DateTime对象上致电Parse()

所以,像这样:

var date = DateTime.Parse(dateStr, CultureInfo.InvariantCulture, DateTimeStyles.AdjustToUniversal).Date;

答案 1 :(得分:0)

如果日期格式没有改变,那么您可以使用以下代码从日期字符串中获取日期部分。但由于它严格依赖输入格式,因此风险很大。

        string dateStr = "2017-03-21T23:00:00.000Z";
        int year = Int32.Parse(dateStr.Substring(0, 4));
        int month = Int32.Parse(dateStr.Substring(5, 2));
        int day = Int32.Parse(dateStr.Substring(8, 2));
        var date = new DateTime(year, month, day);
        Console.WriteLine(date);

答案 2 :(得分:0)

因为'DateTime'变量类型的格式是'YYYY-MM-DD hh:mm:ss'。 如果您运行此代码:

public interface LogConnectionDao extends JpaRepository<LogConnection,Long> {

}

你会看到'24 / 03/2017 2017:54:47' 如果您有'YYYY-MM-DD'格式,请添加.ToString(“dd-MM-yyyy”),然后:

var dt = DateTime.Now;
Console.WriteLine(dt);

结果:'24 -03-2017'