0

ファイルからいくつかの文字列といくつかの日付を読み取る datagridview があります。これは、このデータを保存するために使用する辞書です(新しいレコードを追加し、日時値を保存するために使用されます)

private Dictionary<string, DateTime> gDict = new Dictionary<string, DateTime>();

それがデータをファイルに保存する方法です:

 public bool SaveTableToFile()
        {
            System.Data.DataTable curr_table = dgv.DataSource as System.Data.DataTable;
            try
            {
                using (System.IO.StreamWriter strwr = new System.IO.StreamWriter(filePath + @"\" + fileName, false))
                {
                    strwr.WriteLine("__FILE_BEGIN__");
                    foreach (KeyValuePair<string, DateTime> kvp in gDict)
                    {
                        strwr.WriteLine("__LINE_BEGIN__");
                        strwr.WriteLine("Date=" + kvp.Value.ToString("dd.MM.yyyy hh:mm:ss"));
                        strwr.WriteLine("IP=" + kvp.Key);
                        strwr.WriteLine("__EOL__");
                        strwr.Flush();
                    }
                    strwr.WriteLine("__EOF__");
                    strwr.Close();
                    return true;
                }
            }
            catch { return false; }
        }

//ここで finally ブロックが見つからないことに気付きました。私のキャッチはひどいものです

そして、それがファイルhttp://pastebin.com/uZN4CdxZからそれを読み取る方法です

タイムスパンとしてテーブルに表示されるこの日付 -

DateTime now = DateTime.Now;
...
 DateTime dt = new DateTime();//15.03.2013 3:01:13 //dd.MM.yyyy hh:mm:ss
 dt = DateTime.ParseExact(preparedString[1], "dd.MM.yyyy hh:mm:ss", System.Globalization.CultureInfo.CurrentCulture);
 TimeSpan timediff = (now - dt);

プログラムを実行すると、ファイルからすべてのエントリが読み取られ、時間差が計算され、表に表示されます。そして問題があります - すべての時差が間違っています.12時間余分にかかります. テーブルの例

テーブルがロードされた後に新しい行を追加すると

  public void TryAddNewRow(string ex_IP)
        {
            if (!gDict.ContainsKey(ex_IP))
            {
                System.Data.DataTable curr_table = dgv.DataSource as System.Data.DataTable;
                System.Data.DataRow theRow = curr_table.NewRow();
                DateTime dt = DateTime.Now;
                theRow["Date"] = (dt - DateTime.Now);
                theRow["IP"] = ex_IP;
                curr_table.Rows.Add(theRow);
                gDict.Add(ex_IP, dt);
            }
            else
            {
                TimeSpan ts = DateTime.Now - gDict[ex_IP];
                System.Windows.Forms.MessageBox.Show("IP already exists, it was used" + Environment.NewLine + ts.Hours+" hours, "+ts.Minutes +" minutes, and "+ts.Seconds+" seconds ago.");
            }
        }

最初にゼロが表示されます (0:00:00 のようなもの)。しかし、1分ごとに実行されるタイマーによってテーブルが更新されると、12時間1分になります。

   private void timer1_Tick(object sender, EventArgs e)
        {
            gTable.SaveTableToFile();
            gTable.UpdateTable();
            label1.Text = DateTime.Now.ToString("HH:mm.ff") + ": Table updated.";
        }

 public void UpdateTable()
        {
            CreateNewDataSource();
            //reading data from file and creating rows            
            ReadTableFromFile();
        }

        private void CreateNewDataSource()
        {
            dgv.DataSource = null;
            System.Data.DataSet myDataSet = new System.Data.DataSet();
            System.Data.DataTable aTable = new System.Data.DataTable("Table 1");
            myDataSet.Tables.Add("Table 1");
            List<System.Data.DataColumn> columnsList = new List<System.Data.DataColumn>();
            foreach (TableField curr_field in fTableFields.ftfList)
                columnsList.Add(new System.Data.DataColumn(curr_field.Name, curr_field.FieldType));
            foreach (System.Data.DataColumn column in columnsList)
                myDataSet.Tables["Table 1"].Columns.Add(column);
            dgv.DataSource = myDataSet.Tables["Table 1"];
            foreach (TableField curr_field in fTableFields.ftfList)
                dgv.Columns[curr_field.Name].Width = curr_field.HeaderWidth;
        }
4

1 に答える 1

3

この問題は、一貫性のない解析形式に起因します。

使用している場所hh(12 時間形式) と、使用している場所HH(24 時間形式) があります。
つまり、12 時間形式であるかのように時間を解析していますが、24 時間形式であるかのように表示しています。

その"1:30"ため、13:30 として解析され"13:30"、元は"01:30"(AM) だったとしても、 と表示されます。

使用するすべての形式を置き換えますHH

詳細については、カスタムの日付と時刻の書式文字列を参照してください。

于 2013-09-15T16:02:00.783 に答える