20

当我这样做时,我有相同的结果 1338161400

    DateTime origin = new DateTime(1970, 1, 1, 0, 0, 0, 0);
    DateTime date = DateTime.Parse(@"28/05/12 01:30");
    TimeSpan diff = date.ToUniversalTime() - origin;
    Console.WriteLine( (Math.Floor(diff.TotalSeconds)).ToString());

以及当我使用 date.AddHours(-4) 时:

    DateTime origin = new DateTime(1970, 1, 1, 0, 0, 0, 0);
    DateTime date = DateTime.Parse(@"28/05/12 01:30");
    date.AddHours(-4);
    TimeSpan diff = date.ToUniversalTime() - origin;
    Console.WriteLine( (Math.Floor(diff.TotalSeconds)).ToString());

我尝试像http://www.mbari.org/staff/rich/utccalc.htm一样获得 1338168600

更新:

谢谢我改成

    DateTime origin = new DateTime(1970, 1, 1, 0, 0, 0, 0);
    DateTime date = DateTime.Parse(@"28/05/2012 01:30");
    date = date.AddHours(-4);
    date = date.ToUniversalTime();
    TimeSpan diff = date - origin;
    Console.WriteLine((Math.Floor(diff.TotalSeconds)).ToString());  

但我得到了 1338147000 仍然不是 1338168600

4

8 回答 8

68

日期是不可变的对象,即它们在创建后不能被修改。DateTime.AddHours 返回一个新的 DateTime 实例,该实例向后移动 4 小时,但不会修改“日期”。

采用:

DateTime newDate = date.AddHours(-4);
于 2012-05-28T08:19:42.037 回答
8

AddHours返回一个 DateTime对象,该对象是将小时数添加到原始对象上的结果。原件保持不变。

因此,您想要date = date.AddHours(-4);的不仅仅是date.AddHours(-4);

于 2012-05-28T08:19:23.610 回答
5

原始日期向后设置了 4 小时,但您没有将其设置为新日期。试试这个:

date = date.AddHours(-4);
于 2012-05-28T08:20:48.057 回答
4

AddHours只需返回新的递增日期,使用这个:

date = date.AddHours(-4);
于 2012-05-28T08:19:41.117 回答
3

DateTime 不是一成不变的。只是 DateTime 方法不会更改结构,而是返回一个新结构。

如果你这样做:

DateTime d1 = DateTime.Now;
DateTime d2 = DateTime.Now;
d1 = d2;

然后,结构 d1 将被 d2 的值覆盖。

我不知道是否有可能拥有一个不可变的结构。

于 2015-10-27T19:41:59.950 回答
2

AddHours 返回新的 DateTime 对象。做这个:

date = date.AddHours(-4);

文档:链接

于 2012-05-28T08:20:40.023 回答
1

试试这是否有效:

System.DateTime today = System.DateTime.Now;
System.TimeSpan duration = new System.TimeSpan(0, 11, 0, 0);
System.DateTime answer = today.Add(duration);
System.Console.WriteLine("{0:dddd}", answer);

这似乎改变了日期中的日期,也增加了小时数。

于 2018-03-28T00:31:44.737 回答
1

这是我的解决方案:

     private DateTime SetTime(DateTime datetime, string span="max")
     {
        var hour = datetime.Hour;
        var min = datetime.Minute;
        var sec = datetime.Second;
        if (span == "min")
            datetime = datetime.Add(new TimeSpan(-hour, -min, -sec));
        else
            datetime = datetime.Add(new TimeSpan(23-hour, 59-min, 59-sec));
        return datetime;
     }

     public void GetDateTimes()
     {
            var start = "1/1/2022";
            var end = "31/3/2022";
            var cultureInfo = new CultureInfo("es-ES");
            var startDate = DateTime.Parse(start, cultureInfo);
            var endDate = DateTime.Parse(end, cultureInfo);
            if (startDate > endDate)
                (startDate, endDate) = (endDate, startDate);
            startDate = SetTime(startDate, "min");
            endDate = SetTime(endDate);
            Console.Writeline($"start: {startDate} - end: {endDate}");
            // returns: start: 01/01/2022 00:00:00 - end: 31/03/2022 23:59:59
    }

方法 SetTime 使您想要的。

GetDateTimes 方法防止交换开始(旧日期)和结束(新日期)。

(我从这个问题出发。)

于 2021-12-01T12:22:38.593 回答