[英]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.