Форум программистов, компьютерный форум, киберфорум
Наши страницы
C# для начинающих
Войти
Регистрация
Восстановить пароль
 
 
ArrSoft
0 / 0 / 5
Регистрация: 16.04.2014
Сообщений: 46
Завершенные тесты: 3
#1

Ускоренное время - C#

26.11.2015, 05:50. Просмотров 689. Ответов 20
Метки нет (Все метки)

Добрый день!
Нужно сделать что-то подобное DateTime, но ускоренное в 8 раз. Т.е 24 часа в таком DateTime равны 3-м часам реального времени.
Как сделать такое, чтобы почти не нагружало систему, я не знаю.
http://www.cyberforum.ru/csharp-beginners/thread946017.html
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
26.11.2015, 05:50
Я подобрал для вас темы с готовыми решениями и ответами на вопрос Ускоренное время (C#):

В сообщении может содержаться время в формате чч:мм. Увеличите время на n минут
Дана строка, в которой содержится осмысленное текстовое сообщение. Слова...

Ускоренное проигрывание mp3 треков
Добре, njdfhboxb. Недавно, приятель установил мне заново wXP? всё вроде ничего,...

Сильно ускоренное воспроизведение видео
Ищу софт для ускоренного воспроизведения видео (запись с камеры на несколько...

Учебник. Ускоренное изучение языка Ассемблер
Известно, что для изучения языка программирования требуется много времени и...

Ускоренное умножение двоичных чисел по методу Лемана с использованием флагов Z, OV, C
Здравствуйте! Получил задание составить программу на Delphi на тему ускоренное...

20
Rius
Эксперт .NET
4500 / 2852 / 699
Регистрация: 25.05.2015
Сообщений: 8,809
Записей в блоге: 10
Завершенные тесты: 4
26.11.2015, 06:21 #2
Создавать объект DateTime из числа секунд, умноженного на 3, прошедшего от точки отсчёта.
0
ArrSoft
0 / 0 / 5
Регистрация: 16.04.2014
Сообщений: 46
Завершенные тесты: 3
26.11.2015, 06:26  [ТС] #3
Но ведь тогда секунды будут просто умножены на 3, все будет точно так же, только в полную минуту будет входить 180 секунд, за одну секунду будет прибавляться 3.
Да и умножать надо на 8.
0
Rius
Эксперт .NET
4500 / 2852 / 699
Регистрация: 25.05.2015
Сообщений: 8,809
Записей в блоге: 10
Завершенные тесты: 4
26.11.2015, 06:27 #4

Не по теме:

А, да, умноженное на 8


Будет не точно так же, а в 8 раз быстрее. Можно ещё к миллисекундам привязаться.
0
ArrSoft
0 / 0 / 5
Регистрация: 16.04.2014
Сообщений: 46
Завершенные тесты: 3
26.11.2015, 06:31  [ТС] #5
Думал о том, чтобы сделать свой класс для этого, который будет пересчитывать часы и минуты по секундам*8 взятых из DateTime. Но если рассудить, то при достижении 60 секунд, DateTime продолжит отсчет, а присвоить число в DateTime не получается.
0
Rius
Эксперт .NET
4500 / 2852 / 699
Регистрация: 25.05.2015
Сообщений: 8,809
Записей в блоге: 10
Завершенные тесты: 4
26.11.2015, 06:39 #6
Создать объект с датой/временем - точкой отсчёта.
Добавить к нему 100500 секунд, которые = 8 * TimeSpan.TotalSeconds.
Профит.

Добавлено через 5 минут
C#
1
2
3
            DateTime start = new DateTime(2015, 11, 26, 0, 0, 0);
            TimeSpan span = DateTime.Now.Subtract(start);
            DateTime now8 = start.AddSeconds(span.TotalSeconds * 8);
Ещё у DateTime есть и более точные параметры, до сотен наносекунд.
0
ArrSoft
0 / 0 / 5
Регистрация: 16.04.2014
Сообщений: 46
Завершенные тесты: 3
26.11.2015, 06:47  [ТС] #7
C#
1
DateTime now = start.AddSeconds(span.TotalSeconds * 8);
Жалуется на эту строчку. "System.ArgumentOutOfRangeException: Значение для добавления находилось вне допустимого диапазона."
0
Rius
Эксперт .NET
4500 / 2852 / 699
Регистрация: 25.05.2015
Сообщений: 8,809
Записей в блоге: 10
Завершенные тесты: 4
26.11.2015, 06:51 #8
C#
1
2
3
4
5
6
DateTime start = new DateTime(2015, 11, 26, 0, 0, 0);
Debug.WriteLine(start);
TimeSpan span = DateTime.Now.Subtract(start);
Debug.WriteLine(span);
DateTime now8 = start.AddSeconds(span.TotalSeconds * 8);
Debug.WriteLine(now8);
26.11.2015 0:00:00
08:49:34.0715326
28.11.2015 22:36:32
Код полностью свой приводите.
1
ArrSoft
0 / 0 / 5
Регистрация: 16.04.2014
Сообщений: 46
Завершенные тесты: 3
26.11.2015, 09:07  [ТС] #9
Так, заработало, была ошибка из-за того, что первые 3 значения выставил как единицы.
Появился другой вопрос.
Нужно передать пакет с этим временем на клиентское приложение.
Передаю уже ускоренное время. В клиенте оно принимается, уже там ускоряется в 8 раз, но время слишком сильно отличается. На сервере время 8:02, в клиентском приложении 23:40.
Приложил код работы с полученными значениями.
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
    public int Hour;
    public int Minute;
    public int Second;
    public DateTime start;
    public DateTime now;
    public TimeSpan span;
 
public void Time(string hour, string minute, string second) //В этот метод отправляются значения из сервера
    {
        int sHour = int.Parse(hour);
        int sMinute = int.Parse(minute);
        int sSecond = int.Parse(second);
        start = new DateTime(2015, 11, 26, sHour, sMinute, sSecond);
    }
public void Update() //Тут время уже ускоряется
    {
        if (start != null)
        {
            span = DateTime.Now.Subtract(start);
            now = start.AddSeconds(span.TotalSeconds * 8);
            Hour = now.Hour;
            Minute = now.Minute;
            Second = now.Second;
        }
    }
0
Rius
Эксперт .NET
4500 / 2852 / 699
Регистрация: 25.05.2015
Сообщений: 8,809
Записей в блоге: 10
Завершенные тесты: 4
26.11.2015, 09:15 #10
Время не ускоряется, лишь пересчитывается.
Зачем его умножать, передавать и снова умножать?
Смотрите в отладчике или в Debug выводе, что там вычисляется.
0
ArrSoft
0 / 0 / 5
Регистрация: 16.04.2014
Сообщений: 46
Завершенные тесты: 3
26.11.2015, 09:23  [ТС] #11
Ну смотрите, на сервере время пересчитывается, затем отправляется в клиентское приложение. В клиентском приложении, если время не начать пересчитывать, то оно начинает идти с нормальной скоростью.
0
Rius
Эксперт .NET
4500 / 2852 / 699
Регистрация: 25.05.2015
Сообщений: 8,809
Записей в блоге: 10
Завершенные тесты: 4
26.11.2015, 09:25 #12
Это время не ускоряется и не идёт.
Вы пересчитываете его, передаёте клиенту, и он это принятое время просто отображает.
Игра какая-то?
0
ArrSoft
0 / 0 / 5
Регистрация: 16.04.2014
Сообщений: 46
Завершенные тесты: 3
26.11.2015, 10:29  [ТС] #13
Клиент принятое время пересчитывает дальше, чтобы не отправлять постоянно лишние пакеты. Да, игра, пытаюсь сделать внутри игровое время.
0
Rius
Эксперт .NET
4500 / 2852 / 699
Регистрация: 25.05.2015
Сообщений: 8,809
Записей в блоге: 10
Завершенные тесты: 4
26.11.2015, 10:38 #14
Тогда передаёте время точки отсчёта. Не слишком далёкое от текущего, чтобы не было
System.ArgumentOutOfRangeException: Значение для добавления находилось вне допустимого диапазона
Например, время старта сервера.
Клиент его получает, запоминает. Также запоминает время получения этого пакета. Далее отсчитывает прошедшее время с момента получения пакета, умножает секунды на 8 и прибавляет их к времени начала отсчёта сервера.

Добавлено через 2 минуты
Некоторые игры просто прибавляют к текущей дате 1000 лет и всё. А время идёт как и положено, 1 к 1
Если дата в игре не привязана к нашему календарю, можно не передавать время, а вычислять его на основе времени UTC.

Добавлено через 1 минуту
Т.е. 8:00 часов в игре всегда будет совпадать с ** часов 00 минут реального времени.
0
ArrSoft
0 / 0 / 5
Регистрация: 16.04.2014
Сообщений: 46
Завершенные тесты: 3
26.11.2015, 10:42  [ТС] #15
Но разве не достаточно отправить текущее время, а потом уже от него отсчитывать? Хотя отсчеты как-то странно идут.
Ну так не интересно) Нужно чтобы в реальных сутках содержалось больше 3-х игровых)
0
Rius
Эксперт .NET
4500 / 2852 / 699
Регистрация: 25.05.2015
Сообщений: 8,809
Записей в блоге: 10
Завершенные тесты: 4
26.11.2015, 10:44 #16
Можно, но зачем?)
В реальных сутках будет в 8 раз больше игровых суток. Один реальный час содержит 8 игровых.
0
ArrSoft
0 / 0 / 5
Регистрация: 16.04.2014
Сообщений: 46
Завершенные тесты: 3
26.11.2015, 10:53  [ТС] #17
Ну так проще, чем со старта сервера вычислять время)
0
Rius
Эксперт .NET
4500 / 2852 / 699
Регистрация: 25.05.2015
Сообщений: 8,809
Записей в блоге: 10
Завершенные тесты: 4
26.11.2015, 11:28 #18
Не проще. Можно отправить текущее время реальное, но клиент его и так имеет. Отправить изменённое - он его и сам может вычислить, имея время начала отсчёта.
И ничего этого не нужно, если привязаться к текущему времени клиента. Даты не будет нормальной, но время пересчитать будет проще.
0
ArrSoft
0 / 0 / 5
Регистрация: 16.04.2014
Сообщений: 46
Завершенные тесты: 3
26.11.2015, 11:40  [ТС] #19
Но ведь у всех разные часовые пояса, как сделать так, чтобы время у всех было одинаковое?
0
Rius
Эксперт .NET
4500 / 2852 / 699
Регистрация: 25.05.2015
Сообщений: 8,809
Записей в блоге: 10
Завершенные тесты: 4
26.11.2015, 11:41 #20
Есть UTC. В отличие от локального времени, оно везде одинаковое. Если часы и часовой пояс настроены правильно.
Если не настроены, можно один раз при запуске определить разницу между серверным UTC и клиентским.
0
26.11.2015, 11:41
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
26.11.2015, 11:41
Привет! Вот еще темы с решениями:

Суммарное время ожидания покупателей (общее время простоя в очереди) в магазине
Задача: Время между последовательными прибытиями покупателей в магазин...

Как переконвертировать время из unix epoch формата в понятную дату и время?
Уважаемые форумчане! Не могу нигде найти адекватного решения обратной...

Определить время окончания рабочего дня зная время начала и продолжительность
Доброго времени! Помогите, пожалуйста, решить задачку в Delphi :help: Дело в...

компьютер вырубается во время игр каждый раз через разное время.
помогите пожалуйста* компьютер Acer aspire m3201. * ** ** * Тип ЦП* ** ** **...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru