Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.61/88: Рейтинг темы: голосов - 88, средняя оценка - 4.61
 Аватар для artem1403
15 / 11 / 7
Регистрация: 24.03.2014
Сообщений: 57

Как сравнивать время?

07.05.2014, 08:40. Показов 18418. Ответов 11
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Добрый день!

Пишу себе на работе маленькую консольную программку, которая напоминает про перерывы (по 15 минут), про обед и т.д.
Так вот, в принципе разобрался, определяю текущий момент времени, складываю и т.д.

Вопрос:
Как сравнить текущее время с временем заданным вручную?
Смысл задачи, определять, что сейчас, перерыв или обед, или конец рабочего дня.
C#
1
2
3
4
5
6
DT_NOW = DateTime.Now;
//вот как тут задать переменную например вот такую
/*тут какой-то тип данных*/ TM_1 = "10:30:00";
/*тут какой-то тип данных*/ TM_2 = "10:31:00";
if (DT_NOW>=TM_1 & DT_NOW<=TM_2)
Console.WriteLine("Сейчас перерыв!");
Подскажите пожалуйста
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
07.05.2014, 08:40
Ответы с готовыми решениями:

Как сравнивать время с time
Здравствуйте. Знаю, что функция time записывает время в секундах. 2 вопроса: 1. Есть допустим значение времени, извлеченное из базы,...

Как сравнивать char '\'?
Компиляция следуещего кода приводит к ошибке: if(field == field &amp;&amp; field == '\') turnOn = true; после слэша ожидается значение...

Подскажите как сравнивать
Подскажите как сравнивать между собой введенные значения.(в структурах)

11
 Аватар для IsRiot
9 / 9 / 2
Регистрация: 05.07.2013
Сообщений: 86
07.05.2014, 09:23
попробуй сравнивать строки
конвертировать в строку - ToString, во что то другое (в том числе и строку) - Convert

хотя с таким же успехом можно работать с типом DateTime
0
 Аватар для Spawn
995 / 893 / 354
Регистрация: 24.03.2014
Сообщений: 2,381
Записей в блоге: 2
07.05.2014, 09:28
Цитата Сообщение от artem1403 Посмотреть сообщение
/*тут какой-то тип данных*/
TimeSpan
Сравнивать, например, так:
C#
1
2
3
4
            if (DateTime.Now.TimeOfDay > new TimeSpan(10, 15, 30))
            {
 
            }
Добавлено через 31 секунду

Не по теме:

IsRiot, упаси господь таким заниматься

3
 Аватар для Kruds
708 / 708 / 226
Регистрация: 04.03.2013
Сообщений: 1,384
07.05.2014, 09:42
Или так:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
using System;
using System.Collections.Generic;
using System.Timers;
 
class Program
{
    static Dictionary<DateTime, string> signals;
    static Timer timer;
    const int INTERVAL = 60000;
 
    static Program()
    {
        signals = new Dictionary<DateTime, string>() { {DateTime.Parse("10:30"), "Перерыв"},
                                                       {DateTime.Parse("12:00"), "Обед"},
                                                       {DateTime.Parse("14:30"), "Перерыв"}};
        timer = new Timer(INTERVAL);
        timer.Elapsed +=new ElapsedEventHandler(timer_Elapsed);
    }
 
    static void timer_Elapsed(object sender, ElapsedEventArgs e)
    {
        DateTime now = DateTime.Now;
        foreach (var item in signals)
            if (now.Hour == item.Key.Hour && now.Minute == item.Key.Minute)
                Console.WriteLine(item.Value);
    }
 
    static void Main(string[] args)
    {
        timer.Start();
        Console.Read();
    }
}
1
 Аватар для artem1403
15 / 11 / 7
Регистрация: 24.03.2014
Сообщений: 57
07.05.2014, 10:08  [ТС]
Цитата Сообщение от Spawn Посмотреть сообщение
TimeSpan
Сравнивать, например, так:

C#
1
2
3
if (DateTime.Now.TimeOfDay > new TimeSpan(10, 15, 30))
 {
}
Я думаю на данный момент мне такое решение подойдет.

Еще нашел вот [ссылки на форумы запрещены]
и еще вот здесь

Kruds, спасибо за материал, но я пока еще не освоил события, поэтому не имею представления, как это работает в C# (с событиями знаком из VB на уровне "вешанья" действий на click,change и т.д.).
Попозже выложу что получится
0
07.05.2014, 10:51

Не по теме:

Цитата Сообщение от artem1403 Посмотреть сообщение
но я пока еще не освоил события
Хороший повод разобраться в них:)

0
 Аватар для artem1403
15 / 11 / 7
Регистрация: 24.03.2014
Сообщений: 57
08.05.2014, 17:26  [ТС]
Ну вот, после долгих стараний получилось вот такое консольное приложение:
Кратко, можем указывать произвольные промежутки времени (в 1 дне).
Выводит время от начала периода, время до конца периода и его имя.
Также выводит сколько времени назад кончился прошлый период, и через сколько начнется ближайший следующий.

Внешне выглядит конечно не очень, но мне удобно что в название программы всегда выводится время до конца текущего периода.

Кидаю весь код.
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
using System;
using System.IO;
using System.Globalization;
 
 
    public class Period
    {
    TimeSpan PerBegin;      // Начало периода
    TimeSpan PerEnd;        // Конец периода
    public string PerName;  // Наименование периода
    ConsoleColor NameColor; // Цвет, которым будет выводиться название
 
    CultureInfo cultures = new CultureInfo("en-US");    //исп. для вывода времени
    string format = @"hh\:mm\:ss";                      //исп. для вывода времени
 
    public Period (TimeSpan Begin,TimeSpan End,string Name,ConsoleColor Color) {
            PerBegin = Begin;
            NameColor = Color;
            PerEnd = End;
            PerName = Name;
        }
 
 
    public int wherePeriod ()
    { //Определяем, прошел сегодня период, идет, или только будет идти.
        TimeSpan tsBegin;
        TimeSpan tsEnd;
 
        tsBegin = DateTime.Now.TimeOfDay - PerBegin;
        tsEnd=DateTime.Now.TimeOfDay - PerEnd;
        // Период от начала-----Период от конца-----Результат
        // Положительный       Положительный      Период прошел
        // Положительный       Отрицательный      Период идет сейчас
        // Отрицательный       Отрицательный      Период будет в будущем
 
        if (tsBegin.Ticks > 0 & tsEnd.Ticks >= 0)
            return 0;//Период прошел
        if (tsBegin.Ticks >= 0 & tsEnd.Ticks < 0)
            return 1;//Период идет сейчас
        if (tsBegin.Ticks < 0 & tsEnd.Ticks < 0)
            return 2;//Период будет в будущем
 
        //Если где-то ошибся, вернем -1
        return -1;
    }
 
 
    public void Show ()
    {//Выводит Имя, начало-конец периода
        Console.WriteLine("{0} c {1} до {2}, Состояние {3}",PerName, PerBegin.ToString(format, cultures),PerEnd.ToString(format, cultures),this.wherePeriod());
        }
 
    public TimeSpan HowLast () {
        int z = this.wherePeriod ();
 
        if (z == 0) {
            return DateTime.Now.TimeOfDay - PerEnd;
        } else if (z == 1) {
            return DateTime.Now.TimeOfDay - PerBegin;
        } else {
            return new TimeSpan(23,59,59);
        }
    }
 
    public TimeSpan HowFuture () {
        int z = this.wherePeriod ();
        if (z == 0) {
            return new TimeSpan(23,59,59);
        } else if (z == 1) {
            return PerEnd-DateTime.Now.TimeOfDay;
        } else {
            return PerBegin-DateTime.Now.TimeOfDay;
        }
    }
 
    public void ShowAll ()
    {
        int z = this.wherePeriod();
        if (z == 0) {
            Console.Write ("{0} назад  был ", this.HowLast().ToString(format, cultures));
 
            Console.ForegroundColor = this.NameColor;
            Console.Write ("\"{0}\"", this.PerName);
            Console.ResetColor ();
        }
 
        if (z == 1) {
            Console.ForegroundColor = this.NameColor;
                Console.WriteLine ("\t\t\t{0}\n", this.PerName.ToUpper());
            Console.ResetColor ();
            Console.WriteLine("\t\tПрошло {0,24}",this.HowLast().ToString(format, cultures));
            Console.WriteLine("\t\tОсталось {0,22}",this.HowFuture().ToString(format, cultures));
 
        }
 
        if (z == 2) {
            Console.Write (", через {0} будет ",this.HowFuture().ToString(format, cultures));
            Console.ForegroundColor = this.NameColor;
            Console.WriteLine ("\"{0}\"", this.PerName);
            Console.ResetColor ();
        }
    }
 
    }
    
 
 
class Program
{
    static void Main(string[] args)
    { 
        int Status;
        long minLastPer = long.MaxValue;
        int lastPer = -1;
 
        long minNowPer = long.MaxValue;
        int NowPer = -1;
 
        long minFuturePer = long.MaxValue;
        int FuturePer = -1;
 
        long CurLastTicksPer;
        long CurFutureTicksPer;
 
        Console.Title = "";
 
        Period[] periods = new Period[] {
            new Period (new TimeSpan (0, 0, 0),   new TimeSpan (8, 59, 59), "Отдых",       ConsoleColor.Magenta    ),
            new Period (new TimeSpan (9, 0, 0),   new TimeSpan (18, 0, 0),  "Рабочий день",  ConsoleColor.Red        ),
            new Period (new TimeSpan (10, 30, 0), new TimeSpan (10, 45, 0), "Перерыв",       ConsoleColor.Green      ),
            new Period (new TimeSpan (11, 45, 0), new TimeSpan (12, 45, 0), "Обед",         ConsoleColor.DarkYellow ),
            new Period (new TimeSpan (15, 30, 0), new TimeSpan (15, 45, 0), "Перерыв",       ConsoleColor.Green      ),
            new Period (new TimeSpan (18, 0, 1),  new TimeSpan (23, 59, 59),"Отдых",       ConsoleColor.Magenta    )
        };
 
        for (;;) {
            Console.Clear ();
 
            //найдем прошедший период, который был позже всех (ближе всего к текущему вмемени).
            //найдем действующий период, который раньше всех (из действующих) закончится.
            //Найдем будущий период, который будет раньше всех (ближе всего к текущему времени).
            minLastPer = long.MaxValue;
            minNowPer = long.MaxValue;
            minFuturePer = long.MaxValue;
 
 
            for (int i = 0; i < periods.Length; i++) {
                Status = periods [i].wherePeriod ();
                CurLastTicksPer = periods [i].HowLast ().Ticks;
                CurFutureTicksPer = periods [i].HowFuture ().Ticks;
 
                if (Status == 0) {
                    if (CurLastTicksPer < minLastPer) {
                        minLastPer = CurLastTicksPer;
                        lastPer = i;
                    }
                }
 
                if (Status == 1) {
                    if (CurFutureTicksPer < minNowPer) {
                        minNowPer = CurFutureTicksPer;
                        NowPer = i;
                    }
                }
 
                if (Status == 2) {
                    if (CurFutureTicksPer < minFuturePer) {
                        minFuturePer = CurFutureTicksPer;
                        FuturePer = i;
                    }
                }
 
            }
            Console.ForegroundColor = ConsoleColor.Yellow;
            Console.WriteLine ("============================================================================");
            Console.WriteLine ("============================================================================");
            Console.ResetColor ();
                Console.WriteLine ("\n");
                periods [NowPer].ShowAll ();
                Console.WriteLine ();
                Console.WriteLine ();
                periods [lastPer].ShowAll ();
                periods [FuturePer].ShowAll ();
            Console.Title = periods [NowPer].PerName + " - " + periods [NowPer].HowFuture ().ToString (@"hh\:mm\:ss", new CultureInfo ("en-US"));
            Console.WriteLine ();
            Console.WriteLine ();
            Console.ForegroundColor = ConsoleColor.Yellow;
            Console.WriteLine ("============================================================================");
            Console.WriteLine ("============================================================================");
            Console.ResetColor ();
            System.Threading.Thread.Sleep (1000);
        }
 
    }
}
Просьба к форумчанам, если есть предложения, как опимизировать/упростить/улучшить код - прошу в студию , только пожалуйста, с примерами, чтобы понятно было о чем Вы говорите .

Есть 1 вопрос!!, приложение в основном свернутое, как программно активизировать и вытащить поверх всех окон окно программы??, хочу, чтобы при смене периода, окно вылетало поверх всех окон (даже если сейчас свернуто). Если у кого есть решение, прошу поделиться (сам не нашел к сожалению )
1
 Аватар для Spawn
995 / 893 / 354
Регистрация: 24.03.2014
Сообщений: 2,381
Записей в блоге: 2
08.05.2014, 19:45
Цитата Сообщение от artem1403 Посмотреть сообщение
окно вылетало поверх всех окон
C#
1
2
3
4
            WindowState = FormWindowState.Normal;
            TopMost = true;
            Show();
            Activate();
1
Master of Orion
Эксперт .NET
 Аватар для Psilon
6102 / 4958 / 905
Регистрация: 10.07.2011
Сообщений: 14,522
Записей в блоге: 5
08.05.2014, 22:28
Была у меня программка-напоминалка в качестве курсовой год назад. К сожалению, время не пощадило, и солюшен проекта был утерян, осталась только сама программа и отчет Авось кому пригодится:
https://www.cyberforum.ru/atta... 1393438311

Добавлено через 49 секунд
Основной класс - Notificatior. В нем происходит подсчет времени и решение о вызове события "время настало":
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.Diagnostics;
using System.IO;
using System.Linq;
using System.Threading;
using System.Xml.Serialization;
using Wintellect.PowerCollections;
 
namespace ZANotificator.Core
{
    public class Notificator : IDisposable
    {
        public delegate void EventHandler<in TEventArgs>(object sender, TEventArgs e);
        private static readonly TimeSpan Period = TimeSpan.FromSeconds(1);
        private readonly Timer _timer;
        private readonly string _path;
        private readonly OrderedBag<MyEvent> _events = new OrderedBag<MyEvent>();
        static readonly XmlSerializer Serializer = new XmlSerializer(typeof(MyEvent[]));
        private readonly MyEvent[] _missingEvents = new MyEvent[0];
        private const string EventsFile = "data.xml";
 
 
        public Notificator(string path)
        {
            _path = path;
            _timer = new Timer(TimerTick);
            string file = Path.Combine(path, EventsFile);
 
            if (!File.Exists(file))
            {
                return;
            }
            using (var fs = new FileStream(file, FileMode.Open))
            {
                IEnumerable<MyEvent> myEvents;
                try
                {
                    myEvents = (MyEvent[]) Serializer.Deserialize(fs);
                }
                catch
                {
                    return; //Файл поврежден
                }
 
                var dt = DateTime.Now.AddSeconds(1);
                var groupEvents = myEvents.GroupBy(e => e.EventDateTime > dt).ToArray();
                int nonMissingEventsIndex = groupEvents[0].Key ? 0 : 1;
                int missingEventsIndex = 1 - nonMissingEventsIndex;
 
                if (nonMissingEventsIndex < groupEvents.Length)
                    _events = new OrderedBag<MyEvent>(groupEvents[nonMissingEventsIndex]);
                if (missingEventsIndex < groupEvents.Length)
                    _missingEvents = groupEvents[missingEventsIndex].ToArray();
                Array.Sort(_missingEvents);
            }
        }
 
        private void TimerTick(object o)
        {
            if (_events.Count == 0)
                return;
            var myEvent = _events.GetFirst();
            double diff = Math.Abs((myEvent.EventDateTime - DateTime.Now).TotalMilliseconds);
            Debug.WriteLine(diff);
            if ((diff <= 1500))
            {
                OnEventStarted();
            }
        }
 
        public void Start()
        {
            _timer.Change(TimeSpan.Zero, Period);
        }
 
        public void Stop()
        {
            _timer.Change(new TimeSpan(int.MaxValue), Period);
        }
 
        public void AddEvent(MyEvent e)
        {
            _events.Add(e);
            OnEventAdded(e);
        }
 
        public void RemoveEvent(MyEvent e)
        {
            Stop();
            _events.Remove(e);
            OnEventRemoved(e);
            Start();
        }
 
 
        public void Dispose()
        {
            if (_events.Count == 0 && _missingEvents.Length == 0)
                return;
            _events.AddMany(_missingEvents);
            using (var fs = new FileStream(Path.Combine(_path, EventsFile), FileMode.Create))
                Serializer.Serialize(fs, _events.ToArray());
            GC.SuppressFinalize(this);
        }
 
        public event EventHandler<MyEvent> EventStarted;
        public event EventHandler<MyEvent> EventRemoved;
        public event EventHandler<MyEvent> EventAdded;
 
        protected virtual void OnEventAdded(MyEvent e)
        {
            var handler = EventAdded;
            if (handler != null)
                handler(this, e);
        }
 
        protected virtual void OnEventRemoved(MyEvent e)
        {
            var handler = EventRemoved;
            if (handler != null)
                handler(this, e);
        }
 
        protected virtual void OnEventStarted()
        {
            EventHandler<MyEvent> handler = EventStarted;
            var e = _events.GetFirst();
            _events.RemoveFirst();
            if (handler != null)
                handler(this, e);
        }
 
        public ReadOnlyCollection<MyEvent> Events
        {
            get
            {
                return new ReadOnlyCollection<MyEvent>(_events.ToArray());
            }
        }
 
        public MyEvent[] LostEvents
        {
            get
            {
                return _missingEvents;
            }
        }
 
        ~Notificator()
        {
            Dispose();
        }
    }
}
1
 Аватар для artem1403
15 / 11 / 7
Регистрация: 24.03.2014
Сообщений: 57
09.05.2014, 20:01  [ТС]
Цитата Сообщение от Spawn Посмотреть сообщение
C#
1
2
3
4
WindowState = FormWindowState.Normal; 
TopMost = true; 
Show(); 
Activate();
Подскажите пожалуйста, какой using необходим для работы?
Для консольного окна тоже этот код подойдет?
0
Эксперт .NET
 Аватар для insite2012
5548 / 4311 / 1218
Регистрация: 12.10.2013
Сообщений: 12,371
Записей в блоге: 2
09.05.2014, 20:05
artem1403, ссылку на библиотеку к проекту на System.Windows.Forms.dll и соответственно using System.Windows.Forms;
1
 Аватар для Spawn
995 / 893 / 354
Регистрация: 24.03.2014
Сообщений: 2,381
Записей в блоге: 2
09.05.2014, 22:37
Цитата Сообщение от artem1403 Посмотреть сообщение
Для консольного окна тоже этот код подойдет?
С консолью всё немного иначе будет...
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
09.05.2014, 22:37
Помогаю со студенческими работами здесь

Как сравнивать строки?
Что-то смотрю в туториалы, но ничего не выходит. Как написать сравнение строк? add_field_to_table() { BUFFER='add_field_to_table' ...

Как сравнивать строки?
где ошибка? if ((textBox1.Text + textBox1.Text) = (textBox2.Text)) { button2.BackColor = Color.Green; ...

как сравнивать даты?
Имеется текстовый файл, в нем список учебных дней когда есть математика, в формате &quot;дд/мм/гг,дд/мм/гг,дд/мм/гг,&quot; и т.д. и даты...

Как сравнивать строки?
Ребят, а может вы знаете, как в этом языке сравнивать строки? походу просто string1&gt;string2 не проходит.

Как сравнивать ip-адреса (+)
Всем привет! В общем задача у меня стоит такая: есть список диапазонов ip-адресов, напрмер: 192,168,0,0 - 192,168,255,255 а также...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
12
Ответ Создать тему
Новые блоги и статьи
Midnight Chicago Blues
kumehtar 24.03.2026
Такой Midnight Chicago Blues, знаешь?. . Когда вечерние улицы становятся ночными, а ты не можешь уснуть. Ты идёшь в любимый старый бар, и бармен наливает тебе виски. Ты смотришь на пролетающие. . .
Контроль уникальности заводского номера - вариант №2
Maks 24.03.2026
В отличие от предыдущего варианта добавлено прерывание циклов, также добавлены новые переменные для сохранения контекста ошибки перед прерыванием цикла: Процедура ПередЗаписью(Отказ, РежимЗаписи,. . .
SDL3 для Desktop (MinGW): Вывод текста со шрифтом TTF с помощью библиотеки SDL3_ttf на Си и C++
8Observer8 24.03.2026
Содержание блога Финальные проекты на Си и на C++: finish-text-sdl3-c. zip finish-text-sdl3-cpp. zip
Жизнь в неопределённости
kumehtar 23.03.2026
Жизнь — это постоянное существование в неопределённости. Например, даже если у тебя есть список дел, невозможно дойти до точки, где всё окончательно завершено и больше ничего не осталось. В принципе,. . .
Модель здравоСохранения: работники работают быстрее после её введения.
anaschu 23.03.2026
geJalZw1fLo Корпорация до введения программа здравоохранения имела много невыполненных работниками заданий, после введения программы количество заданий выросло. Но на выплатах по больничным это. . .
Контроль уникальности заводского номера - вариант №1
Maks 23.03.2026
Алгоритм контроля уникальности заводского (или серийного) номера на примере документа выдачи шин для спецтехники с табличной частью в КА2. Данные берутся из регистра сведений, по которому настроено. . .
Хочу заставить корпорации вкладываться в здоровье сотрудников: делаю мат модель здравосохранения
anaschu 22.03.2026
e7EYtONaj8Y Z4Tv2zpXVVo https:/ / github. com/ shumilovas/ med2. git
Программный отбор элементов справочника по группе
Maks 22.03.2026
Установка программного отбора элементов справочника "Номенклатура" из модуля формы документа в КА2. В качестве фильтра для отбора справочника служит группа номенклатуры. Отбор по наименованию. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru