Страницы

Поиск по вопросам

Показаны сообщения с ярлыком время. Показать все сообщения
Показаны сообщения с ярлыком время. Показать все сообщения

понедельник, 24 февраля 2020 г.

Почему strtotime() и time() дают разное время?

#php #время


Сразу приведу пример кода:

$time1 = strtotime('+1 week');
$time2 = time() + 3600*24*7;

var_dump($time1);
var_dump($time2);

echo PHP_EOL;

var_dump(date('Y-m-d H:i:s', $time1));
var_dump(date('Y-m-d H:i:s', $time2));


Вот полученные результаты:

int(1459164441)
int(1459168041)

string(19) "2016-03-28 12:27:21"
string(19) "2016-03-28 13:27:21"


Т.е. разница ровно час.

Случайно наткнулся, проверял чего тест стал падать, там дата проверялась.

Интересно, что вчера и позавчера, неделю и месяц назад возвращаемое время было абсолютно
одинаковым!

UPD: Временная зона установлена "Europe/London".
    


Ответы

Ответ 1



В ночь с субботы на воскресенье 27 марта часы переводятся на час назад. Временная зона была установлена "Europe/London". Т.к. сегодня стукнуло 21 марта, то через неделю уже будет 28 марта. И соответственно время strtotime('+1 week') уже выдаёт результат с учётом перевода времени на час назад. У нас в Беларуси уже отменили перевод на летнее/зимнее время. В России тоже. На временной зоне "Europe/Minsk" и "Europe/Moscow" возвращаемое время одинаковое в обоих случаях. $time1 = strtotime('+1 week'); $time2 = time() + 3600*24*7; В общем, проблема различий во времени связана с переводом времени на час для указанной временной зоны "Europe/London". Функция strtotime учитывает часовой пояс, а time - нет, возвращает unix-timestamp.

пятница, 14 февраля 2020 г.

Тип для хранения времени в С++

#cpp #время #cpp17


У меня стоит задача написать функцию, которая получает от GPS и возвращает текущее
время. В какой структуре или объекте, какого класса из стандартной библиотеки мне хранить
это время? Мне нужно, что бы была возможность легко задавать и получать значения секунд,
минут, часов и т.п. Т.е. что то типа      

time_point time_now = now();
int hour = time_now.hour();
int second = time_now.second();
time_now.second = 0; 


Сейчас у меня много где в коде используется std::chrono::time_point, но как, имея
конкретный объект получить, например количество часов прошедших от начала суток я не
знаю.  
    


Ответы

Ответ 1



Можете воспользоваться стандартной библиотекой C для работы с датой и временем: std::time_t t = time(nullptr); std::cout << localtime(&t)->tm_hour; В C++20 в библиотеку chrono добавляются функции для работы с датой, временем, временными зонами, новые классы часов и т.д. подробнее на cppreference Сейчас Вы можете, например, сконвертировать time_point в std::time_t и также использовать функции из стандартной библиотеки C: using sc = std::chrono::system_clock; std::time_t t = sc::to_time_t(sc::now()); std::cout << localtime(&t)->tm_hour; В Boost имеется библиотека Date_Time В Qt также имеется класс для работы со временем - QDateTime.

Ответ 2



Вам принципиальны "++"? Если нет, то gettimeofday(), localtime(), mktime() и работы со struct timeval может быть достаточно.

четверг, 13 февраля 2020 г.

разрешение аппаратного таймера

#cpp #windows #время


С помощью команды в терминале powercfg -energy duration 5 узнал величину разрешение
аппаратного таймера: 15,6 мс. В моих программах требуется, чтобы эта величина равнялась
1 мс. Как этого добиться при запуске программы?
Для программирования пользуюсь Visual Studio 2013\2015, язык C++.

PS Замечания к ответу от avp: вот тут я уже задавал вопрос про таймеры и многие попробовал.
Поскольку работал с сетью, то отслеживал еще и через wireshark время пакетов отправленных
с помощью таймеров. Результат оказывался плачевным.
    


Ответы

Ответ 1



Возможно, функции timeBeginPeriod и timeEndPeriod (MSDN) это то что вам нужно. С их помощью, вы как раз сможете выставить желаемую точность в 1мс.

Ответ 2



Не тот таймер используете. Вообще-то в системе их несколько, но не всегда очевидно, как ими правильно пользоваться. Поэтому, возможно лучшим решением будет использовать функцию gettimeofday, которая выдает время с точностью до микросекунд (до какой степени им можно доверять это уже другой вопрос). Если в VS она недоступна, то вот тут есть ее виндовая реализация.

воскресенье, 9 февраля 2020 г.

Сбивается время в Win7 ровно на 3 часа. Часовой пояс сохраняется

#windows_7 #время


Предыстория:

На 240-гигабайтном SSD-накопителе десктопа стояли лицензионная 7-я Винда (около 140
Гб) и Ubuntu 14.04. Решил подключить второй монитор, чтобы удобнее было учиться. Подключал,
естественно, при выключенном системном блоке.

В результате Виндоус перестала запускаться совсем (уходила в ребут после одного бегунка
при загрузке), а Убунту никаких проблем не показала - стала работать на 2 монитора,
как хотелось.

Поскольку восстановить Виндоус не удалось никакими средствами (руки вроде бы растут
откуда надо, кое-что умею), поставил ту же самую систему заново, предварительно обновив
Убунту до 16.04. Еще при этом заменил батарейку на материнской плате на новую.

Сама проблема:

Все бы ничего, но за прошедший месяц заметил неприятную мелочь - после нескольких
дней работы у Виндоус слетает время ровно на 3 часа, при этом часовой пояс сохраняется.
Т.е. сейчас у меня по Киеву должно быть 19:43, а Виндоус показывает 16:43.

Поймать момент, когда это происходит - не удавалось пока. 

Кто что может подсказать?
    


Ответы

Ответ 1



В Ubuntu в терминале прописать timedatectl set-local-rtc 1, и тогда на Windows 7 время сбиваться не будет. По умолчанию Ubuntu при загрузке устанавливает таймер BIOS в UTC 0 (Coordinated Universal Time - Координированное Универсальное Время). А Windows загрузившись воспринимает это время как локальное и показывает его как ни в чем не бывало

суббота, 8 февраля 2020 г.

Разбить время в миллисекундах на дни/часы/минуты

#время #java


Имеется время

long lasttime = getLastLogin(user);

Надо вычесть из текущего времени (System.currentTimeMillis()) время lasttime и полученный
результат разбить на дни, часы и минуты, чтобы узнать, какое время пользователя нет в сети.
Обновление
У меня что-то вроде этого, но я сильно сомневаюсь в точности:
long em = (long)((System.currentTimeMillis()-lp) / 1000 / 60L);//min ::
int eh = (int)((em*60)-(int)(em/60));//hour ::
int ed = (int)((em*60*24)-(int)(em/60/24));//day
    


Ответы

Ответ 1



Можно воспользоваться такими дивными вещами, как Calendar и SimpleDataFormat. Вот пример рабочий: import java.text.SimpleDateFormat; import java.util.Calendar; public class Test { public static void main(String[] args) { Calendar dating = Calendar.getInstance(); SimpleDateFormat formating = new SimpleDateFormat("YYYY:MM:dd:HH:mm:ss:SSS"); System.out.println( formating.format(dating.getTime()) ); } } В результате выполнения мы получим: "2014:07:29:10:22:49:824" (Результат с теста кода). Думаю, код понятен, но стоит сказать по поводу конструктора класса SimpleDataFormat. Вот здесь Описаны все ключи, которые можно использовать в форматировании. Вместо двоеточих можно использовать точки и другие символы. Например: "YYYY/MM/dd" Выводит: 2014/07/29 "dd MMM YYYY" Выдаст 29 Jul 2014 На заметку SimpleDataFormat хорошо работает и с результатом метода System.currentTimeMillis(), а вот как определять дату, через календарь, или через систему - решать вам. Стоит отметить, что Calendar имеет такие свойства, как DAY_OF_WEEK, MONDAY и т.д. Вот с ними и надо оперировать, что бы узнать разницу между точками отрезка во времени. Конечно, код ниже не является номинантом на "панацею от проблем", но всё же решает данную задачу. import java.util.Calendar; import java.util.Date; public class Test { public static void main(String[] args) throws InterruptedException { /* Дата, которую сохранили */ Calendar SaveData = Calendar.getInstance(); /* промежуток: тест - 6 секунд */ Thread.sleep(6000); /* текущая дата */ Calendar CurrentData = Calendar.getInstance(); /* вычисляем */ Calendar calculate = Calendar.getInstance(); calculate.setTime(new Date(CurrentData.getTime().getTime() - SaveData.getTime().getTime())); /* Здесь станцуем с бубном, мы получим количество часов, поэтому ручками */ System.out.println(((calculate.get(Calendar.DAY_OF_YEAR) - 1 ) * 24) + (calculate.get(Calendar.HOUR_OF_DAY) - 11) + ":" + calculate.get(Calendar.MINUTE) + ":" + calculate.get(Calendar.SECOND)); } } В результате выполнения мы получим 0:0:6 (то есть 6 секунд). Думаю, код понятен. (тестил - работает). Думаю, что не сложно будет разобраться и с тем, как получить количество дней. Но ещё сделаю заметку. Для идеала надо учитывать и года, так как календарь имеет ограничения по дням, но это не сложно; поэтому, думаю, данную задачу уже решишь ты.

среда, 5 февраля 2020 г.

Как сравнить две метки времени ЧЧ:ММ?

#javascript #jquery #время


В JS есть переменная var a = '14:35', значение a изменяется динамически, она получает
время. Надо сравнить со временем браузера, время браузера это var b = '14:37'. Если
время браузера больше чем на 2 минуты, то есть, допустим, 14:37, то вывести alert('опоздал
на 2 минуты'). Как такое реализовать?
    


Ответы

Ответ 1



var a = '23:59'; var b = '00:10'; //разделяем минуты и часы, часы умножаем на 60. //Минуты умножаем на 1, чтобы преобразовать в число var amin=a.split(':')[0]*60+a.split(':')[1]*1; var bmin=b.split(':')[0]*60+b.split(':')[1]*1; //Если второе время меньше первого больше чем на 12 часов, добавим 24 часа: if(bmin+60*12 0) alert('опоздал на '+c+' минут');

суббота, 1 февраля 2020 г.

Как осуществить слияние k сортированных списков

#python_3x #сортировка #list #память #время


Даны k отсортированных в порядке неубывания массивов натуральных чисел, каждое из
которых не превосходит 100. Требуется построить результат их слияния: отсортированный
в порядке неубывания массив, содержащий все элементы исходных k массивов.

Длина каждого массива не превосходит 10 ⋅ k.

Постарайтесь, чтобы решение работало за время k ⋅ log(k) ⋅ n, если считать, что входные
массивы имеют длину n.

Формат ввода

Первая строка входного файла содержит единственное число k, k ≤ 1024.

Каждая из следующих k строк описывает по одному массиву. Первое число каждой строки
равняется длине соответствующего массива, оставшиеся числа этой строки описывают значения
элементов этого же массива. Элементы массивов являются натуральными числами и не превосходят 100.

Формат вывода

Выходной файл должен содержать отсортированный в порядке неубывания массив, содержащий
все элементы исходных массивов.

Пример

Ввод

4
6 2 26 64 88 96 96
4 8 20 65 86
7 1 4 16 42 58 61 69
1 84

Вывод

1 2 4 8 16 20 26 42 58 61 64 65 69 84 86 88 96 96

Ограничение по времени выполнение скрипта 1 сек. для любого теста, ограничение по
используемой памяти: 10 МБ

Вот мой код:

import sys

int_str = ''
n = int(sys.stdin.readline().strip())
for i in range(int(n)):
    s = sys.stdin.readline().strip() + ' '
    count = int(s[:s.find(' ')])
    p, j = 0, 0
    for j in range(s.__len__()):
        if s[j] == ' ':
            p += 1
        if p == count+1:
            break
    int_str += s[s.find(' '):j]
    del (s,)

for i in sorted(int_str.lstrip().split(' '), key=lambda x: int(x) if x.isdigit() else 0):
    print(i, end=" ")


Ещё один вариант

import sys

n = int(sys.stdin.readline().strip())
int_list = []
for i in range(n):
    input = sys.stdin.readline().strip()
    data = list(map(int, input.split()))
    input = None
    n = data[0]
    a = data[1:n+1]
    int_list.extend(a)
    data = None

int_list.sort()

for li in int_list:
    sys.stdout.write(str(li) + ' ')
sys.stdout.write('\n')


Гномья сортировка

import sys

int_list = []
t = [0] * 101
n = int(sys.stdin.readline().strip())
for i in range(int(n)):
    s = sys.stdin.readline().strip()
    try:
        num = int(s[:s.find(' ')])
    except ValueError:
        continue
    for index, value in enumerate(s.split(' ')):
        if index == 0:
            continue
        elif index == num + 1:
            break
        try:
            t[int(value)] += 1
        except ValueError:
            pass
    del s

res = []
for i in range(101):
    res += [i] * t[i]

for r in res:
    print(r, end=' ')


Memory Limit и Time Limit близко
    


Ответы

Ответ 1



Так как в задаче есть ограничение на элементы массива: массивов натуральных чисел, каждое из которых не превосходит 100. то можно применить сортировку подсчётом, которая работает за линейное время. Но для C# возникает ещё одна проблема - это создание массива строк при считывании данных, которые на больших данных используют > 10Мб памяти. Я решила эту проблему с помощью запуска сборщика мусора. Моё решение: using System; using System.IO; namespace ConsoleApp { class Program { static void Main(string[] args) { short[] digitsCount = new short[101]; short k = Convert.ToInt16(Console.ReadLine()); string[] values; for (short i = 0; i < k; i++) { values = Console.ReadLine().Split(' '); for (short j = 1; j < values.Length; j++) { digitsCount[Convert.ToByte(values[j])]++; } GC.Collect(); } using (StreamWriter sw = new StreamWriter("output.txt")) { for (short i = 0; i < digitsCount.Length; i++) { for (short j = 0; j < digitsCount[i]; j++) { sw.Write(i + " "); } } } } } } Удачи на собеседовании!

Ответ 2



Сложность k * n Time Limit помогло убрать периодический вывод буфера, а не накопление его до N k = int(input()) count = {str(i): 0 for i in range(100)} total = 0 for list_index in range(k): a = input().split() size = int(a[0]) total += size if size > 0: for i in range(1, size + 1): count[a[i]] += 1 buff = [] for i in range(100): c = str(i) if i % 10 and buff: print(' '.join(buff), end=' ') buff = [] buff.extend([c] * count[c]) print(' '.join(buff)) Тест list + int() vs dict vs Counter from timeit import timeit from collections import Counter n = 10000000 str_list = [str(x) for x in range(n)] number = 10 print(timeit(""" for i in range(n): a[int(str_list[i]) % 100] += 1 """, setup='a = [0] * 100', number=number, globals=globals())) print(timeit(""" for i in range(n): d[str_list[i % 100]] += 1 """, setup='d = {str(i): 0 for i in range(100)}', number=number, globals=globals())) print(timeit(""" for i in range(n): d[str_list[i % 100]] += 1 """, setup='d = Counter(i for i in range(100))', number=number, globals=globals())) PyPy 3.5.3 (не понятно, почему Яндекс его не добавили): 6.919497203998617 1.7934346760011977 5.253608144004829 Python 3.7 27.728900675007026 17.81548438500613 25.83648096800607

Ответ 3



Тоже столкнулся с этой задачей. Начал с Python 3.6. Пробовал сортировку подсчетом и heapq.merge. Ни в какую не укладываюсь в 1 секунду на 20м тесте. Попробовал переписать на Go и сортировку подсчетом. Результат по времени абсолютно такой же как на Python. Видимо от языка не зависит. package main import ( "bufio" "fmt" "os" "strconv" "strings" ) func main() { const k = 100 reader := bufio.NewReader(os.Stdin) arraysNumString, _ := reader.ReadString('\n') arraysNumString = strings.TrimSuffix(arraysNumString, "\n") arraysNum, err := strconv.Atoi(arraysNumString) if err != nil { panic(err) } var counter [k]int for i := 0; i < arraysNum; i++ { inputString, _ := reader.ReadString('\n') inputString = strings.TrimSuffix(inputString, "\n") inputArray := strings.Split(inputString, " ") for idx, i := range inputArray { if idx == 0 { continue } j, err := strconv.Atoi(i) if err != nil { panic(err) } counter[j]++ } } for index, value:= range counter { for i := 0; i < value; i++ { fmt.Println(index) } } } Видимо нужно искать другой алгоритм или экономить на чтении строк.

Ответ 4



В задаче не оговорен запрет на использование стандартной библиотеки, поэтому моё решение выглядит следующим образом (для Python 3.4.3): from collections import Counter k = int(input()) a = Counter() for _ in range(k): a += Counter(map(int, input().split()[1:])) for key, c in sorted(a.items()): print("{} ".format(key) * c, end="") Ключевой момент здесь в том, что элементы в вводимых массивах не могут быть больше 100, а это значит, что количество ключей для Counter() не превысит это число. Даже в худшем случае, сортировка сотни целочисленных значений - простая задача. Опасения у меня вызывал только момент с суммированием Counter(), однако даже в последнем тесте, данный вариант затратил <5 mb памяти и уложился во время <0.7секунды.

Ответ 5



Реализация решения H. Case на основе встроенных типов. Результаты - 0.522s, 4.36Mb. n = int(input()) def counter_add(counter, value): if value in counter: counter[value] += 1 else: counter[value] = 1 counter = dict() for _ in range(n): ar = input().split() for i in ar[1:]: counter_add(counter, i) for i in range(101): i = str(i) if i in counter: print(' '.join([i] * counter[i]), end=' ')

Ответ 6



Я решила вот так - по-простому: k=int(input()) result={x:0 for x in range(0,101)} for i in range(k): current=input().split()[1:] for j in range(len(current)): cj = int(current[j]) result[cj] += 1 for key, v in result.items(): print("{} ".format(key) * v, end="")

Ответ 7



А я решил пойти путем использования одномерных векторов. Жаль, что Я не принял импорт NumPy... Пришлось тоже через сортировку подсчетом делать. Надеюсь, будет полезно и на такой вариант взглянуть. import sys import numpy as np k = sys.stdin.readline().strip() A = np.array([], dtype=np.uint8) for _ in range(int(k)): line = np.array(sys.stdin.readline().strip().split(" ")[1:], dtype=np.uint8) A = np.append(A, line) del line A = np.sort(A, kind="mergesort") A = A.tolist() print(*A)

пятница, 31 января 2020 г.

Как грамотно вычесть несколько минут из текущего времени в С++?

#cpp #время


Уважаемые коллеги! 
Производственная необходимость просит написать текущее время за минусом 10 минут
и у меня не очень-то получается. Напомню, что получают время примерно так: 

#include "stdafx.h"
#include 
#include 
#include 
#include  // size_t
#include  // strlen, strcpy

using namespace std;


int main()
{
    setlocale(LC_ALL, "Russian");

    SYSTEMTIME st, lt;

    GetSystemTime(&st);
    GetLocalTime(<);
    double dm = st.wMinute - 5; //за минусом 5 минут
    double dm1 = lt.wMinute - 5; //за минусом 5 минут
    //Просто вывод времени
    printf("The system time is: %02d:%02d\n", st.wHour, st.wMinute);
    printf(" The local time is: %02d:%02d\n", lt.wHour, lt.wMinute); 
    //Новое время для моего проекта.
    printf("The system time is: %02d:%02d\n", st.wHour, dm); 
    printf(" The local time is: %02d:%02d\n", lt.wHour, dm1);
    system("PAUSE");
    return 0;
}


Output:

The system time is: 09:24
 The local time is: 12:24
The NEW system time is: 09:00
 The NEW local time is: 12:00


Вполне очевидно что третья и четвёртая строка нас не могут удовлетворить.
Как грамотно исправить это безобразие?
    


Ответы

Ответ 1



Чувствую, что намеки в комментариях не помогают... Начните со строк double dm = st.wMinute - 5; //за минусом 5 минут double dm1 = lt.wMinute - 5; //за минусом 5 минут Замените их строками int dm = st.wMinute - 5; //за минусом 5 минут int dm1 = lt.wMinute - 5; //за минусом 5 минут Дальше будут другие проблемы - когда эта разность окажется отрицательной... но это уже немного другой вопрос.

Ответ 2



Вы не указали ОС, для которой пишете задачу. Судя по вызовам - Windows? В Linux всё очень просто: #include #include int main(int argc, char *argv[]) { time_t t_wrk, t_10; struct tm *ptm; t_wrk = time(NULL); // Текущее время в СЕКУНДАХ t_10 = t_wrk - 600; // 10 минут назад // Печатаем результат ptm = localtime(&t_wrk); printf("Было: %d минут\n", ptm->tm_min); ptm = localtime(&t_10); printf("Стало: %d минут\n", ptm->tm_min); } Подозреваю, что и в виндовозе эти базовые функции работы со временем давным-давно реализованы. Проверил на переход границы часа. Границу суток проверят не стал - слишком уж всё очевидно!

вторник, 28 января 2020 г.

Функция rand в цикле

#cpp #время #случайные_числа


double rnd()
{
    srand(time(0));
    return(rand() % 1000 / 1000.0);
}


Функцию выше вызываю в цикле, нужно совершить 1600 * 50000 прокручиваний. 
Все знакомы с функцией time(), цикл за секунду пробегает во много раз больше шагов,
чем 1. В итоге получаю докучи одинаковых чисел. 

Для решения моей задачи мне необходимы получать на каждом прокручивание случайное
число (вероятность) какого-то события.
    


Ответы

Ответ 1



srand(time(0)); нужно вызывать один раз в начале. Случайность будет нормальная. Постоянный вызов srand случайность не улучшает. Дополнение Если очень сильно упростить эти две функции (очень сильно), то код будет выглядеть где-то так: int seed = 0; // это начальное значение генератора int gen = 0; // начальное значения рандома int magick = 1234567; // это такая специальная магическая константа, я ее сам придумал:) // а вообще то есть целые исследования, которые определяют правильные константы // того же Кнута почитать можно void srand(int s) { seed = s; } int rand() { return func(gen, seed); } int func(int g, int s) { // эта функция на базе предыдущего значения вычисляет новое. // главное, что нужно понимать, что при одних и тех же значениях аргументов, // результат будет один и тот же. // реализация, приведенная ниже - это один с возможных вариантов. return (s * magick + g) % 0xFFFFFFFF; } Возникает вопрос - почему так сделано? Все очень просто. Сделать быстрый и качественный генератор достаточно сложно. Поэтому берут самые простые варианты. Усложнять подобные генераторы нет смысла - от этого их качество не улучшится, в лучшем случае останется таким же. Но обычно только ухудшается. Ещё одна причина, по которой это сделано - удобство отладки. Ведь seed определяет всю последовательность. И если его задать одинаковым, то rand будет выдавать одни и те же последовательности. Если нужна действительно случайная последовательность, то тут есть следующие варианты: купить специальное устройство, которое будет генерировать случайные числа. Вот например такое USB-токен «iBank 2 Key». Первое, что нашлось в гугле:) собрать такое устройство самостоятельно - статья на хабре. Там много интересного. купить специальный файл со случайными числами (да, такое продают. Я понимаю, что многие любители Линукса скажут, мол я с /dev/random сам нагенерю, но компании обещают хорошее качество.

Ответ 2



Это - т.наз. "часто возникающая ошибка". Если код программы содержит множественные попытки "перезапустить" генератор псевдослучайных чисел, используя в качестве seed-значения текущее значение времени, полученное через вызов time(NULL) ... srand(time(NULL)); ... то может получиться так, что такие вызовы srand будут следовать друг за другом очень быстро. Так быстро, что time(NULL) будет возвращать одно и то же значение времени. Это приведет к тому, что генератор псевдослучайных чисел будет постоянно перезапускаться с указанием одного и того же seed-значения. В результате последующие вызовы rand() будут порождать одну и ту же псевдослучайную последовательность. Например, вот такой код, будучи запущенным на выполнение, вероятнее всего выведет одну и ту же псевдослучайную последовательность два раза #include #include #include int main() { srand(time(NULL)); for (unsigned n = 20; n > 0; --n) printf("%d ", rand()); printf("\n"); srand(time(NULL)); for (unsigned n = 20; n > 0; --n) printf("%d ", rand()); printf("\n"); } Эта проблема также иногда рапортуется в следующем виде: "Под дебаггерром у меня в программе получаются разные случайные числа, а без дебаггера - одни и те же". Действительно, когда программа выполняется по шагам в интерактивном дебаггере, она выполняется "медленно" и между вызовами srand значение времени time(NULL) успевает измениться, что создает иллюзию того, что все работает "как задумано". Но стоит запустить программу в свободное выполнение, как проблема проявляется во всей красе. Если вам нужен вызов srand(time(NULL)) в вашей программе, то в большинстве случаев его достаточно сделать всего один-единственный раз на старте программы.

Как сгенерировать список дата+время в каком-либо диапазоне с заданным шагом?

#python #python_3x #python_2x #время


Как сгенерировать список дата+время в каком-либо диапазоне с заданным шагом?

Например, мне нужно, чтобы скрипт автоматически вывел куда-нибудь (да хоть в текстовый
файл) все возможные варианты дата:время (например MM/DD/YYYY:hh:mm:ss), которые присутствуют
в интервале 10/25/2015:00:00:05 - 10/25/2015:23:59:58 с шагом, например 33 секунды.

В моем видении, вывод должен быть таким:

10/25/2015:00:00:05
10/25/2015:00:00:39
...
10/25/2015:14:27:28
...
10/25/2015:21:49:18

    


Ответы

Ответ 1



Используйте модуль datetime: datetime.datetime -- для хранение времени datetime.timedelta -- для увеличения времени на указанное значение времени strptime -- для разбора объекта datetime.datetime по шаблону strftime -- для получения строки с датой из объекта datetime.datetime по шаблону Пример: import datetime as DT date_fmt = '%m/%d/%Y:%H:%M:%S' step = DT.timedelta(seconds=33) start_date = DT.datetime.strptime('10/25/2015:00:00:05', date_fmt) last_date = DT.datetime.strptime('10/25/2015:23:59:58', date_fmt) while start_date <= last_date: print(start_date, '|', start_date.strftime(date_fmt)) start_date += step # 2015-10-25 00:00:05 | 10/25/2015:00:00:05 # 2015-10-25 00:00:38 | 10/25/2015:00:00:38 # 2015-10-25 00:01:11 | 10/25/2015:00:01:11 # 2015-10-25 00:01:44 | 10/25/2015:00:01:44 # 2015-10-25 00:02:17 | 10/25/2015:00:02:17 # ...

Ответ 2



Ленивый вариант с использованием модуля Pandas: import pandas as pd # pip install pandas / conda install pandas DT_FMT = "%m/%d/%Y:%H:%M:%S" def get_date_range(dt_from, dt_to, freq="1D", dt_fmt=DT_FMT, **kwargs): dt_from = pd.to_datetime(dt_from, format=dt_fmt) dt_to = pd.to_datetime(dt_to, format=dt_fmt) return pd.date_range(dt_from, dt_to, freq=freq, **kwargs) (get_date_range("10/25/2015:00:00:05", "10/25/2015:23:59:58", freq="33S") .to_frame(name="TimeStamp") .to_csv("c:/temp/result.csv", date_format=DT_FMT, index=False)) Результат (C:\temp\result.csv): TimeStamp 10/25/2015:00:00:05 10/25/2015:00:00:38 10/25/2015:00:01:11 ... 10/25/2015:23:58:20 10/25/2015:23:58:53 10/25/2015:23:59:26

Ответ 3



Можно с помощью встроенной функции range: from datetime import datetime, timedelta f = '%m/%d/%Y:%H:%M:%S' beg, fin = [datetime.strptime(d, f) for d in ['10/25/2015:00:00:05', '10/25/2015:23:59:58']] step = 33 ts = [beg + timedelta(seconds=s) for s in range(0, int((fin - beg).total_seconds() + 1), step)] В ts будет: ['10/25/2015:00:00:05', '10/25/2015:00:00:38', '10/25/2015:00:01:11', ... '10/25/2015:23:58:20', '10/25/2015:23:58:53', '10/25/2015:23:59:26'] Демо.

воскресенье, 26 января 2020 г.

Есть ли библиотеки для работы с большими датами и временем?

#время #cpp #дата


Добрый день.
Есть ли библиотеки для работы с большими датами и временем?
Григорианский календарь.
То есть раньше 0000 - и больше10000 годов. 
Пробовал boost::date_time там ограничение 1400-10000.
Еще писал обёртку над Си time.h, но там точка отсчёта 1900.
[+] - обязательно
[!] - желательно
[-] - не обязательно

[+] Точные с учетом високосных годов.
[+] Стандартные операции(создание из определенного формата,сложение, вычитание, прибавление
интервалов)
[!] Поддержка н.э и д.н.э.
[!] Поддержка веков.
[+] Поддержка часов минут секунд.
[!] Возможность задать интервал вручную.
[-] Выбор точности вручную(возможность задать 128 битные числа для секунд например). 
[-] Производительность не важна.
    


Ответы

Ответ 1



как подсказали в комментарии, класс QDateTime поддерживает интервал +/- 292 миллиона лет (относительно начала эры).

Отличие chronyd от ntpd

#linux #время #ntp


Чем принципиально отличаются chronyd и ntpd?

Конкретно интересует момент с плавной подстройкой времени. Есть мнение, что chronyd
этого не умеет. Насколько безопасно его использовать в продакшене, особенно в сочетании
с сервисами, которые довольно чувствительно относятся к путешествиям во времени (которые
могут быть вызваны резким переводом часов)? К примеру MySQL сервер может не пережить
резкого перевода времени на несколько секунд и упасть. Что, конечно, недопустимо в
действующем проекте.
    


Ответы

Ответ 1



Chronyd такое ещё как умеет! Причём по умолчанию именно такой режим и активирован. В течение работы Chronyd всегда плавно подстраивает время, если отсутствует директива makestep (или указан нулевой лимит). Впрочем, можно задать число корректировок времени, в которые демон может скачкообразно изменять показания часов.

пятница, 24 января 2020 г.

Как высчитывать разницу во времени, учитывая часовые зоны?

#javascript #время #timezone #momentjs


Мне нужно сделать таймер обратного отсчета до какого-то события при помощи библиотеки
MomentJS.

Сервер мне присылает время (назовем его eventTime), до которого должен идти отсчет,
я выясняю разницу между текущим и вывожу в HTML. Здесь все просто. 
Проблема в том, что сервер присылает время по МСК и преобразование eventTime = moment.utc(time)
в функции таймера мне ничего не дает.

Как мне высчитывать разницу во времени, учитывая часовые зоны? 
    


Ответы

Ответ 1



В идеале конечно получать от сервера время в UTC. Но если это невозможно, преобразовывайте из московского времени с помощью moment timezone: var t = moment.tz("2013-11-18 11:55", 'Europe/Moscow'); И не забывайте обновлять библиотеку moment timezone каждый раз, когда вступит в силу новый закон о летнем времени в зоне 'Europe/Moscow' (и ребята из moment timezone обновят сборку). Альтернативный вариант - присылать с сервера сразу оставшееся время (например в секундах) до нужного события. В этом случае будет не важно, какое время у клиента (в том числе, если оно вообще неправильно выставлено, как иногда бывает когда пытаются продлить триальные версии некоторых программ).

четверг, 23 января 2020 г.

Получить дату сборки программы

#cpp #qt #дата #время #datetime


Как получить время и дату пересборки программы? Далее нужно выводить её в label виджета.
Как понял нужно что-то в .pro файле писать, но вот что, пока не нашел. Есть идеи?
    


Ответы

Ответ 1



Вот мое решение: ui->label->setText(trUtf8("Дата сборки программы: ") + __DATE__ + trUtf8(" в ") + __TIME__);

пятница, 10 января 2020 г.

Android Как получить время, отображаемое в StatusBar

#java #android #время #calendar #timezone


Здравствуйте! 

Некоторые пользователи при переходе на постоянное зимнее время отключили синхронизацию
времени и часового пояса по сети и вручную перевели время на час назад. 

Сейчас у них на телефонах, к примеру, установлен часовой пояс, в котором 14:00, а
на телефоне отображается текущее время 13:00. 

При получении времени методами 

System.currentTimeMillis(), Calendar.getInstance().getTimeInMillis()


возвращает 14:00. Как получить время пользователя правильно?
    


Ответы

Ответ 1



Всё, что я смог найти, сведено вот в этот пост. Резюме: без использования дополнительных запросов к серверу и/или получения собственных координат (которые не всегда могут быть доступны), невозможно получить необходимую разницу во времени. Это же относится и к отменённому летнему времени: часть устройств всё ещё считает, что летом часовой пояс Москвы GMT+4, часть - уже знает, что GMT+3. И кроме запроса на сервер в общем случае никаким образом их не синхронизировать.

Ответ 2



Нет возможности проверить, но думаю нужно получить таймзону и посчитать с ней? TimeZone tz = TimeZone.getDefault(); или попробовать другой способы: Time now = new Time(); now.setToNow(); http://developer.android.com/reference/android/text/format/Time.html

Ответ 3



Calendar.getInstance().getTimeInMillis() возвращает количество миллисекунд в часовом поясе UTC. Как вы проверяете что это соответвует 14:00? Может быть, пользователь не переводил время, а поставил себе соседний часовой пояс? В любом случае попробуйте проверить какой час возвращается если использовать Calendar.getInstance().get(Calendar.HOUR_OF_DAY)

Получение независимого от устройства времени

#java #android #время


Разрабатываю программу одной из функций которой является фиксация определённых событий
по времени, необходимо получать текущее время и дату как-то независимо от устройства
по координатам GPS например, ибо пользователь может переводить часы и мухлевать, или
может просто надо проверять настройки автоматического получения времени и часового
пояса из сети...
Гуру подскажите пожалуйста
    


Ответы

Ответ 1



Была как-то у меня похожая задача. Сразу скажу, что панацеи нет. Я написал свое решение и описал его в статье http://habrahabr.ru/company/etransport/blog/245477/

Ответ 2



создайте службу фиксация времени - который каждую секунду берет current_timestamp и сравнивает со своим. Если нормально берет разницу времени и добавляет в общее время. Общее время сохраняет в ShaerdReference программа когда нужна дата берет данные из ShaerdReference - это будет реальная дата использования программы.

Ответ 3



Можно сделать запрос к более-менее любому NTP серверу и запросить текущее мировое время. В принципе Android девайс все равно получает время от NTP сервера, но обращение к нему недокументировано и сокрыто в непубличном API. Далее применить Google Maps Time Zone API - то есть задав координаты точки получить его TZ (временную зону). Тогда зная мировое время и TZ точки можно получить локальное время в указанной точке координат.

Ответ 4



Coordinates to Time API Know the coordinates? You know the local time. Thousands of people rely on our services every day for their time related needs and now the WorldTime.io Local Time API Service™ Вот что мне нужно только бесплатно ))))

выполнение функции по истечению времени

#c_sharp #время


в моей программе есть функция,которая должна выполняться только в определенное время(дд/мм/гггг).Пользователь
вводит дату,и только в это время функция выполняеться.
как реализовать таймер?
    


Ответы

Ответ 1



Одним из миллиона способов. Например, так: async Task ExecuteAfter(DateTime when, Action function) { DateTime now = DateTime.Now; if (when > now) await Task.Delay(when - now); function(); } Другой метод: DateTime now = DateTime.Now; if (when <= now) { function(); } else { var milliseconds = (when - now).TotalMilliseconds; var timer = new System.Timers.Timer(milliseconds) { AutoReset = false }; timer.Elapsed += (o, args) => { function(); timer.Stop(); timer.Dispose(); }; // если вы пишете на WinForms, можете указать ещё // timer.SynchronizingObject = // чтобы вызов произошёл в UI-потоке timer.Start(); } Ещё один: DateTime now = DateTime.Now; if (when <= now) { function(); } else { System.Threading.Timer timer = null; timer = new System.Threading.Timer( o => { function(); timer.Dispose(); }, null, when - now, TimeSpan.Zero); } Ещё один подход — использование синхронизационных примитивов и ожидание с таймаутом события, которое никогда не наступит. Например, при помощи семафора: DateTime now = DateTime.Now; if (when > now) using (var sema = new SemaphoreSlim(0)) sema.Wait(when - now); function(); (Не рекомендуется, блокирует текущий поток!) Ещё один метод, использование потоков + Sleep. Не рекомендуется, т. к. блокирует поток, а это ненужный расход ресурсов. Наихудший метод — блокирование текущего потока: DateTime now = DateTime.Now; if (when > now) Thread.Sleep(when - now); function(); Чуть лучше идея с выгрузкой в отдельный поток: new Thread(() => { DateTime now = DateTime.Now; if (when > now) Thread.Sleep(when - now); function(); }) { IsBackground = true }.Start(); Ещё чуть-чуть лучше использовать thread pool (но всё равно плохо): ThreadPool.QueueUserWorkItem(o => { DateTime now = DateTime.Now; if (when > now) Thread.Sleep(when - now); function(); });

понедельник, 6 января 2020 г.

Как посчитать время потраченное на выполнение задания?

#java #android #время #счетчики


Пишу маленькое приложение на Android на Java. У меня пользователи в одном активити
проходят тест и, по завершению теста, открывается следующее активити, в которое передается
итоговая инфа по прохождению теста. Так вот, одно из полей - это потраченное время
на задание... я пробую считать время хронометром, но он в миллисекундах считает и потом
форматировать через различные проверки в формат 00:00 (02 : 34), очень костыльно получается...
Я уверен, что есть более изящное решение... 

Как это можно сделать?
    


Ответы

Ответ 1



В начале задания сохраняйте текущее время в long переменную: long startTime = System.currentTimeMillis(); После окончания получайте разницу: long totalTime = System.currentTimeMillis() - startTime; Берём класс Calendar и присваиваем ему полученное значение: Calendar cal = Calendar.getInstance(); cal.setTimeInMillis( totalTime ); Получаем минуты/секунды (без нулей в начале): int minutes = cal.get(Calendar.MINUTE); int seconds = cal.get(Calendar.SECOND); или в форматированном виде с помощью класса SimpleDateFormat SimpleDateFormat format = new SimpleDateFormat("mm:ss"); System.out.println(format.format(cal.getTime()));

суббота, 4 января 2020 г.

Преобразование даты из свободного формата в нужный вид

#php #инспекция_кода #время


При парсинге получаем переменную даты в формате "10 июля 2017", и нужно её записать
в базу msql, соотвественно в формате "2017-07-10".

Я написал, но можно ли мой говнокод оптимизировать?

    

    


Ответы

Ответ 1



$input = "10 июля 2017"; $months = ['января', 'февраля', 'марта', 'апреля', 'мая', 'июня', 'июля', 'августа', 'сентября', 'октября', 'ноября', 'декабря']; //------------------------------------------------------ // разбиваем по пробелам $arr = explode(' ', $input); // меняем ключи и значения местами, чтобы можно было искать по названием месяцев // а можно сразу задать ассоциативный массив, // где ключи - названия месяцев значения - номер, чтоб не мудрить $months = array_flip($months); // индекс месяца - это ячейка в массиве $months со значением $arr[1] $newmonth = $months[$arr[1]] + 1; // если индекс меньше 10 - добавляем ноль $newmonth = $newmonth > 9 ? $newmonth : '0'.$newmonth; // результат $output = $arr[2].'-'.$newmonth.'-'.$arr[0]; //------------------------------------------------------ echo $output; без мудрежа $input = "10 мая 2017"; $months = ['января' => '01', 'февраля' => '02', 'марта' => '03', 'апреля' => '04', 'мая' => '05', 'июня' => '06', 'июля' => '07', 'августа' => '08', 'сентября' => '09', 'октября' => '10', 'ноября' => '11', 'декабря' => '12']; //------------------------------------------------------ $arr = explode(' ', $input); $output = $arr[2].'-'.$months[$arr[1]].'-'.$arr[0]; //------------------------------------------------------ echo $output;

Ответ 2



Чуть-чуть расширена задача и не совсем нормальный код ;) function replDate($str) { return preg_replace_callback('%^(\d{1,2})\s(?:(янв)|(фев)|(мар)|(апр)|(ма)|(июн)|(июл)|(авг)|(сен)|(окт)|(ноя)|(дек))\S*\s(\d{4})$%ui', function($matches) { $year = array_pop($matches); array_shift($matches); $day = array_shift($matches); $matches = array_flip($matches); unset($matches['']); $month = array_pop($matches) + 1; return sprintf('%s-%02s-%02s', $year, $month, $day); }, $str); } foreach(['10 июля 2017', '1 янв 2017', '31 май 2017', '8 Июня 2999'] as $d) { var_dump(replDate($d)); } Вывод string(10) "2017-07-10" string(10) "2017-01-01" string(10) "2017-05-31" string(10) "2999-06-08" Тест http://sandbox.onlinephpfunctions.com/code/2e17a72cfc4a42b87afcc4601971ae900e539398

Ответ 3



используйте функцию preg_replace_callback $text = "10 июля 2017"; // функция обратного вызова function new_date($matches) { // как обычно: $matches[0] - полное вхождение шаблона // $matches[1] - вхождение первой подмаски, // заключенной в круглые скобки, и так далее... $month = trim($matches[2]); $month_array = array( "января" => "01", "февраля"=> "02", "марта"=> "03", "апреля"=> "04", "мая" => "05", "июня" => "06", "июля" => "07", "августа" => "08", "сентября" => "09", "октября" => "10", "ноября" => "11", "декабря" => "12", ); //если введен месяц не правильно, вывожу 01, а вы у себя сами решите как быть $newmonth = isset($month_array[$month]) ? $month_array[$month] : '01'; return $matches[3].'-'.$newmonth.'-'.$matches[1]; } echo preg_replace_callback( "|^(\d{2})(.*)(\d{4})$|", "new_date", $text);

пятница, 3 января 2020 г.

Javascript. Формат времени

#javascript #время


Добрый день.
Бьюсь, не могу отобразить время в нужном формате:
Нужно так - 2018-01-05T21:02:46.167030+02:00
Именно с такой последовательностью, с такими символами. Почему-то форматировать правильно
не віходит. 

Вот до чего дошел ( это без попыток форматировать, т.к. они ужасны ):

var date = new Date().toString().replace(/\s+/g,'').replace('(FLEStandardTime)', '');


Буду крайне благодарен, если поможете
    


Ответы

Ответ 1



var date = new Date(); date.toISOString(); Необходимо доработать, чтоб окончание было таким как вам надо. Надо было изменить на стандарт ISO. Также многие для простоты использования юзают Moment.JS

Ответ 2



Может вам попробовать использовать moment.js https://momentjs.com/docs/#/displaying/