C # Clock In / Clock Hour — общее отработанное время

#c# #datetime #timespan #buttonclick

#c# #дата и время #промежуток времени #кнопка

Вопрос:

ПРОБЛЕМА: создайте программу, состоящую из кнопки ввода часов, кнопки выключения часов и метки для хранения общего отработанного времени.

Этот код кажется, что он должен быть простым, но я знаю, что чего-то не хватает. Я не могу получить дату и время clockIn с помощью кнопки inButton для использования с TimeSpan при нажатии кнопки outButton. Я довольно новичок в C #, поэтому любая критика приветствуется. Спасибо!

 using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace TimeClock
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        public void inButton_Click(object sender, EventArgs e)
        {
           DateTime clockIn = DateTime.Now;
        }

        public void outButton_Click(object sender, EventArgs e)
        {
            DateTime clockOut = DateTime.Now;
            TimeSpan timeWorked = clockOut - clockIn;

            string timeWorkedReport = $"Time worked = {timeWorked.Hours} hours, {timeWorked.Minutes} minutes";

            timeLabel.Text = timeWorkedReport;
        }
    }
}
  

Комментарии:

1. Локальная переменная против члена данных класса .. эхх

2. Можно только предположить, что totalTimeWorked это должно быть просто clockout-clockin , но так ли это? Говорит ли что-нибудь об этом в назначении?

3. О, и для вашего следующего вопроса: я предполагаю, что это приводит к ошибке компиляции. Если у вас есть одно или в других случаях, возможно, исключение, всегда включайте их в свой вопрос.

4. Обратите внимание, что вы должны использовать DateTimeOffset для этого сценария, а не DateTime . В противном случае вы получите неверные результаты, если произойдет переход между временем ввода / вывода часов. В качестве альтернативы вы могли бы сделать clockOut.ToUniversalTime() - clockIn.ToUniversalTime() , или вы могли бы просто записать свое время в UTC, чтобы начать с использования DateTime.UtcNow .

Ответ №1:

Самое главное, что вам нужно прочитать о переменных областях и элементах данных.

Менее важно — следующее будет работать:

Я только что повысил вашу переменную до члена класса данных.

 public partial class Form1 : Form
    {
        DateTime clockIn = DateTime.Min;  // Move Here

        public Form1()
        {
            InitializeComponent();
        }

        public void inButton_Click(object sender, EventArgs e)
        {
           clockIn = DateTime.Now;
        }

        public void outButton_Click(object sender, EventArgs e)
        {
            DateTime clockOut = DateTime.Now;
            TimeSpan timeWorked = clockOut - clockIn;

            string timeWorkedReport = $"Time worked = {timeWorked.Hours} hours, {timeWorked.Minutes} minutes";

            timeLabel.Text = timeWorkedReport;
        }
    }