[英]DateTime conversion not working c#
编辑我已经完全编辑了代码,因为我在解决基本错误方面的许多奇怪尝试都使人们误以为人们认为我的代码中存在错误,而这仅仅是尝试解决问题的所有方法。 我试图将完全有效的内置日期时间格式转换为系统日期时间对象的多种方法都失败了,也不知道为什么。
结束
我需要帮助,由于无法解决如此看似简单的任务,我实际上只是扯掉了一些头发,试图将我的日期日志(正确读取的csv)转换为DateTime。 错误是试图将我的日志条目(在打印时,格式正确的日期时间)转换为DateTime对象以进行比较。
EXAMPLE INPUT FROM CSV: 2016-03-22T04:03:31
EXAMPLE INPUT FROM File.GetLastWriteUTC(path): 2016-03-22T04:03:27
两者是相同的,但是我没有特殊原因无法将我的csv日志条目转换为DateTime
。
我尝试了多种格式。 我正在写一个控制台,该控制台证明我正在使用的日期确实是正确的C#兼容日期时间格式。 我已经尝试过使用我可以在线找到的每个参数的DateTime.Parse / ParseExact。 我什至尝试将新的日期时间重新映射为新的格式,或者将字符串转换为日期时间,再转换为具有格式的字符串,然后将正确格式化的字符串转换回日期时间。
但是,每次运行程序时,我都会看到“将字符串转换为DateTime时,在将每个变量放入DateTime对象之前,分析字符串以获取日期”。 并且“请确保您的参数采用相同的格式”,尽管我已经证明它们毫无疑问是正确的格式,没有遗漏零,也没有单引号。 我正在编写使用.ToString修饰符的内置格式,我在尝试f,F o,O,s,S等的列表中处于下降位置。
有人请保存我的理智。 在下面,您可以看到许多让人费解的尝试,试图弄清楚为什么它不起作用,仅当我认为我想出了一些巧妙的方法来保证正确的格式时,它仍然失败了。
using System;
using System.Collections.Generic;
using System.Data.SqlTypes;
using System.Globalization;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.IO;
namespace vimbackupscript2
{
class Program
{
static void Main()
{
while (true)
{
FileSystemWatcher watcher = new FileSystemWatcher();
watcher.Path = "C:\\Program Files\\Git\\etc";
watcher.NotifyFilter = NotifyFilters.LastWrite | NotifyFilters.FileName | NotifyFilters.LastWrite;
DateTime time = File.GetLastWriteTimeUtc(watcher.Path + "\\vimrc");
string logPath = "C:\\Users\\USERPROFILE\\vimbackup\\log.csv";
var logFile = File.ReadAllText(logPath).Split(',');
foreach (var log in logFile)
{
Console.WriteLine(Convert.ToDateTime(log));
}
watcher.Changed += new FileSystemEventHandler(OnChanged);
watcher.WaitForChanged(WatcherChangeTypes.All);
File.WriteAllText(logPath, time.ToString("s") + ",");
}
}
}
}
您可以使用DateTime.ParseExact("2016-03-22T04:03:31", "yyyy'-'MM'-'dd'T'HH':'mm':'ss")
来获取正确的DateTime文化设置。
但是,您的代码中还有其他问题。 您认为转换为日期时间,然后转换为字符串,然后转换为日期时间会得到什么?
如果仅比较失败,那么很显然日期时间转换可以正常工作,因为您已经做到了这一点。
您正在UTC中获取一个DateTime,然后根据本地时间创建另一个DateTime,因此它将根据时区偏移量关闭。 然后,您执行不执行任何操作的ToString()
。
那么,您的实际问题是使DateTime与时区搞混了吗? 调试器将轻松显示当前时间。
如果要比较本地时区中的DateTime,请使用GetLastWriteTime
来获取时间。
问题是,如果您调试代码并检查刻度数。 最好的解决方案是在foreach循环中创建DateTime类型,然后进行比较。 i,e var result = new DateTime(...)
Ive还发布了我的测试代码
using System.Collections.Generic;
using System.Globalization;
using System.Text;
using System.Threading.Tasks;
using System.IO;
namespace Test
{
class Program
{
static void Main()
{
{
//I NEED TO COMPARE THIS TIME WITH THE LAST LOGGED TIME
DateTime x = DateTime.Now;
DateTime time = x; //File.GetLastWriteTimeUtc(watcher.Path + "\\vimrc");
DateTime newTimeFormat = new DateTime(time.Year, time.Month, time.Day, time.Hour, time.Minute, time.Second);
time.ToString("O");
string log = x.ToString();
{
Console.WriteLine(Convert.ToDateTime(log).ToString("s"));
var result = Convert.ToDateTime(Convert.ToDateTime(log).ToString("s"));
//THIS ERRORS EVERY SINGLE TIME, EVEN WHEN LOG IS CONVERTED TO A 100% VERIFIABLE LEGITIMATE FORMAT
if (result < time)
{
Console.WriteLine("bleh why don't my conversions work!?!??!!?");
}
}
}
}
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.