Страницы

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

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

понедельник, 30 марта 2020 г.

Python, mysql, вывести сообщения datetime которых < актуального времени на 1 час

#python #mysql #дата #datetime


Например в БД есть такие данные:

id  |        date         |  message
1   2018-11-13 12:00:00      Сообщение 1
2   2018-11-13 13:00:00      Сообщение 2
3   2018-11-13 14:00:00      Сообщение 3


Например актуальный datetime 2018-11-13 14:00:00

Как можно вывести только те даты, которые меньше от актуального datetime хотя бы
на 1 час? В моем случае это Сообщение 2 и Сообщение 1
    


Ответы

Ответ 1



Попробуйте так: q="""SELECT id, date, message FROM table_name WHERE date < DATE_SUB(?, INTERVAL 1 HOUR)""" cur = con.cursor() cur.execute(q, (actual_date,)) # NOTE: `actual_date` should be an instance of [datetime] for row in cur.fetchall(): print(row)

четверг, 19 марта 2020 г.

Разница между двума датами в секундах в Django

#python #django #дата


Хочу получить разницу (в секундах) между двумя датами: текущей и даты, взятой из базы:

models.py:

class Tasks(models.Model):
    dateAdded = models.DateTimeField(auto_now_add=True)


в консоле:

from phone_book.models import Tasks   
this = Tasks.objects.get(id = 50).dateAdded.replace(tzinfo = None)    
import datetime   
now = datetime.datetime.now()    # судя инструкции разница между now и this должна
дать мне необходимую разницу  
delta = now - time  


В результате объект delta возвращает datetime.timedelta(1, 4451, 467165),
у которого есть аргумент seconds, но почему-то в результате delta.seconds выводится
значение 4451, которое значительно отличается от фактической разницы между двумя датами.

В общем вопрос: как мне найти разницу между двумя датами в секундах, либо подскажите
ссылочку на умный источник.

Спасибо!
    


Ответы

Ответ 1



>>> import datetime >>> a = datetime.datetime.now() >>> a datetime.datetime(2012, 8, 7, 14, 34, 14, 63000) >>> b = datetime.datetime(2012, 8, 7, 14, 50, 00) >>> b datetime.datetime(2012, 8, 7, 14, 50) >>> c = b - a >>> c datetime.timedelta(0, 945, 937000) >>> c.seconds 945 >>> c.seconds / 60 15 вроде верно все

Ответ 2



Используйте USE_TZ=True, чтобы django использовала бы время, включающее информацию о часовой зоне. Иначе, вычитая наивные datetime объекты, вы можете ошибку на тысячи секунд получить (к примеру, в районе перехода на летнее время). Чтобы получить текущее время: from django.utils import timezone now = timezone.now() datetime.now() возвращает наивный datetime объект -- не используйте его. Имея datetime с установленным правильным tzinfo, можно уже напрямую вычитать: now - then.

воскресенье, 8 марта 2020 г.

Как ускорить процесс сортирования дат

#php #сортировка #оптимизация #дата


функция pc_date_sort(), приведен
ная в примере  показывает, как сортировать даты.

function pc_date_sort($a, $b) {
    list($a_month, $a_day, $a_year) = explode('/', $a);
    list($b_month, $b_day, $b_year) = explode('/', $b);
    if ($a_year > $b_year ) return 1;
    if ($a_year < $b_year ) return -1;
    if ($a_month > $b_month) return 1;
    if ($a_month < $b_month) return -1;
    if ($a_day > $b_day ) return 1;
    if ($a_day < $b_day ) return -1;
    return 0;
}
$dates = array('12/14/2000', '08/07/1999', '08/10/2001');
usort($dates, 'pc_date_sort');
echo '
';
print_r($dates);


Во время сортировки функция usort() часто – каждый раз, когда ей
надо сравнить два элемента – выполняет пересчет значений, возвра
щаемых функцией сортировки, что замедляет процесс.

Помогите пожалуйста оптимизировать код
Как избежать ненужной работы? 
    


Ответы

Ответ 1



использовать стандартный встроенный класс. Это раньше приходилось свои велосипеды городить с датами. встроенный datetime написан на C, он будет быстрее, он оттестирован и будет безопасней он предлагает больше возможностей чем свой велосипед дополнить его вы можете обернув в свой класс/функцию, унаследовав (не проверял) createFromFormat() создаст объекты из вашего формата дат без всяких дополнительных ухищрений и ручных explode-ов строчек

Ответ 2



Я добавлю свой вариант, но скорей всего буду рассматривать ваши предложния.Несмотря что протестировал вроде быстрее ,и памяти жрет меньше. Для того чтобы избежать ненужной работы, можно кэшировать сравниваемые значе ния, как показано в примере function pc_array_sort($array, $map_func, $sort_func = '') { $mapped = array_map($map_func, $array); // cache $map_func() values if ('' == $sort_func) { asort($mapped); // функция asort() быстрее функции usort() } else { uasort($mapped, $sort_func); // необходимо сохранить ключи } while (list($key) = each($mapped)) { $sorted[] = $array[$key]; // используем отсортированные ключи } return $sorted; } Чтобы избежать ненужной работы, функция pc_array_sort() использу ет временный массив $mapped для кэширования возвращаемых значе ний. Затем она сортирует массив $mapped, используя или порядок сор тировки по умолчанию, или определенную пользователем процедуру сортировки. Важно, что она использует сортировку, сохраняющую связи ключ/значение. По умолчанию она использует функцию asort(), потому что она быстрее, чем функция uasort(). (Медленность функции uasort() это всетаки значительный довод в пользу функции pc_array_sort().) Наконец, она создает отсортированный массив $sort ed, при этом отсортированные ключи в массиве $mapped выступают в ка честве индексов значений исходного массива. Для небольших массивов или коротких функций сортировки функция usort() работает быстрее, но как только число сравнений вырастает, функция pc_array_sort() обгоняет функцию usort(). Ну или сравнивать в пeрвом примере как и посоветовали следующим образом $date1 = DateTime::createFromFormat('!Y/m/d', '2012/10/17'); $date2 = DateTime::createFromFormat('!Y/m/d', '2012/10/17'); var_dump($date1 == $date2); //will be true var_dump($date1 > $date2); //will be false var_dump($date1 < $date2); //will be false

Как изменить дату на 1 день назад

#java #дата


у меня есть переменная 

String date = "10.11.2016";


как мне преобразовать ее в 

String date = "09.11.2016";


Нужно чтобы это делалось для любой даты. Как можно это реализовать?
    


Ответы

Ответ 1



Сначала Вам нужно получить представление заданной даты в виде объекта класса, который предназначен для работы с датами. Этим классом является класс Calendar. Получаете экземпляр класса Calendar: Calendar calendar = Calendar.getInstance(); Создаете объект, который преобразует дату в виде строки (определенного формата) в объект класса Date: SimpleDateFormat sdf = new SimpleDateFormat("dd.MM.yyyy"); Получаете объект класса Date из Вашей строки и инициализируете им calendar: calendar.setTime(sdf.parse(date)); Изменяете объект calendar путем декремента даты: calendar.add(Calendar.DATE, -1); Получаете текстовое представление объект calendar: date = sdf.format(calendar.getTime());

понедельник, 2 марта 2020 г.

изменить тип поля VARCHAR на DATE

#mysql #дата


Два года назад была создана база, сейчас хочется ее немного привести в порядок.

Было неправильно выбрано (по неопытности) хранение даты в обычном varchar, запись
идет туда в виде числа UNIXTIME.

Хочу изменить тип поля VARCHAR на DATE.

Можно ли сделать это быстро через сам mysql запрос в phpMyAdmin?
Или придётся писать функцию, выбирать каждое поле, преобразовывать unix в YYYY-MM-DD,
и записывать его обратно? А после этого уже менять тип?

Число строк около 3000.
    


Ответы

Ответ 1



Самый быстрый способ такой Создаете новый столбец типа TIMESTAMP/DATETIME Выполняете запрос UPDATE mytable SET new_col = FROM_UNIXTIME(old_col); Удаляете старый столбец Переименовываете новый столбец в старое имя

воскресенье, 1 марта 2020 г.

Как убрать “Г.” в JavsScript

#javascript #дата


Здравствуйте, у меня возникла некая проблемка, нужно убрать "Г." при выводе даты в js.

function getLocalYearMonth(d) {
    return d.toLocaleDateString(locale, {
        year: '2-digit',
        month: 'long'
    });
}
var nDate = new Date(year, month, 1);
var title = document.getElementById('c-title');
    title.innerHTML = getLocalYearMonth(nDate);


При выводе получается примерно так: "Апрель 18Г.", мне нужно чтобы выводило просто
"Апрель 18".
    


Ответы

Ответ 1



Кроме двух вариантов костыля ничего в голову не приходит. А заглавную букву можно потом сделать в css при помощи text-transform: capitalize. function getLocalYearMonth(d) { return d.toLocaleDateString("ru-RU", { month: 'long' }) + " " + d.toLocaleDateString("ru-RU", { year: '2-digit' }); } var nDate = new Date(); console.log(getLocalYearMonth(nDate)); function getLocalYearMonth(d) { return d.toLocaleDateString("ru-RU", { month: 'long', year: '2-digit' }) .replace(/\s*г\./, ""); } var nDate = new Date(); console.log(getLocalYearMonth(nDate));

Ответ 2



Просто slice(0, -3). Вернет строку с "отрезанными" тремя последними символами (в данном случае "_г.") function getLocalYearMonth(d) { return d.toLocaleDateString('ru-RU', { year: '2-digit', month: 'long' }).slice(0, -3); } console.log(getLocalYearMonth(new Date())); Варианты с капитализацией строки: function getLocalYearMonth(d) { let result = d.toLocaleDateString('ru-RU', { year: '2-digit', month: 'long' }); return result.charAt(0).toUpperCase() + result.slice(1, -3); } console.log(getLocalYearMonth(new Date())); function getLocalYearMonth(d) { let result = d.toLocaleDateString('ru-RU', { year: '2-digit', month: 'long' }).slice(0, -3); return result.charAt(0).toUpperCase() + result.slice(1); } console.log(getLocalYearMonth(new Date())); function getLocalYearMonth(d) { let result = d.toLocaleDateString('ru-RU', { year: '2-digit', month: 'long' }).split(''); result[0] = result[0].toUpperCase(); return result.slice(0, -3).join(''); } console.log(getLocalYearMonth(new Date())); Рекомендую первый.

вторник, 25 февраля 2020 г.

CultureInfo.InvariantCulture и с чем его едят

#c_sharp #дата


Здравствуйте, уважаемые!
Возник такой вопрос, как использовать CultureInfo.InvariantCulture при конверте строк
в дату и в случае с денежными величинами в double. С датами вроде всё понятно. Как
я понимаю CultureInfo.InvariantCulture говорит о том, что формат в полученной строке
соответствует формату, указанному в языковых настройках твоего компьютера. С датой
я в этом убедился. Однако в случае с денежной величиной возникает вопрос, почему вот это:
double.Parse("2135.45", CultureInfo.InvariantCulture);

нормально конвертится и не вызывает исключений. Ведь денежный формат России указывается
через запятую.    


Ответы

Ответ 1



Не правильно понимаете. Как сказано тут, это как раз не зависимая от языка локаль.

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

Правильный перевод формата даты

#python #дата


У меня есть строка с датой в таком формате:

Thu, 18 Aug 2016 11:38:41 +0300


Как перевести ее к такому виду YYYY-MM-DD hh:mm:ss ?
    


Ответы

Ответ 1



Начиная с python 3.2: from datetime import datetime # Переводим строку в объект datetime d = datetime.strptime('Thu, 18 Aug 2016 11:38:41 +0300', '%a, %d %b %Y %X %z') # Получаем из объекта строку в нужном формате print(str(d.strftime('%Y-%m-%d %X'))) Для ранних версий можете использовать библиотеку dateutil: pip install python-dateutil Для вывода даты в нужном формате используйте аналогично: from dateutil.parser import parse d = parse('Thu, 18 Aug 2016 11:38:41 +0300') print(str(d.strftime('%Y-%m-%d %X'))) Подробнее о том, какие еще манипуляции с форматом можно делать, читайте внизу этой документации

Ответ 2



Подобный формат даты используется в электронной почте, поэтому можно email модуль из стандартной библиотеки использовать: >>> from email.utils import parsedate >>> tt = parsedate('Thu, 18 Aug 2016 11:38:41 +0300') >>> tt (2016, 8, 18, 11, 38, 41, 0, 1, -1) >>> import time >>> time.strftime('%Y-%m-%d %H:%M:%S', tt) '2016-08-18 11:38:41' Код работает как на Питоне 2 так и 3. Принимаемый формат для strftime() функции может зависеть от платформы (от C strftime(3)). Если нужна переносимость, то убедитесь, что использованные кода поддерживаются на желаемых платформах.

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

Определить день недели по дате

#php #дата


На странице анкеты имеется пункт дата рождения. При отправке анкеты необходимо чтобы
рядом с датой рождения прописывался день недели. Нашла вот такое решение в интернете,
но это лишь с текущей датой прокатывает.Как сделать так, чтобы при выборе на начальной
странице в календаре выводилась именно выбранная дата, а не текущая?

    


Ответы

Ответ 1



День недели даты можно узнать следующим образом $date = '2013-01-01'; echo strftime("%a, %d/%m/%Y", strtotime($date));

Ответ 2



Еще вариант echo date("D",time());

среда, 29 января 2020 г.

Изменить формат даты Java Android

#java #android #дата


Есть строка даты примерно такая: Fri, 22 Apr 2016 15:29:51 +0600

Мне ее нужно сделать такой: 22.04.2016 15:29:51

Как можно это сделать на android? Подскажите как сделать, и если знаете ссылку на
статью где можно научится работать с датами и временем.
    


Ответы

Ответ 1



так попробуйте String date = "Fri, 22 Apr 2016 15:29:51 +0600"; SimpleDateFormat df = new SimpleDateFormat("EEE, dd MMM yyyy hh:mm:ss Z"); SimpleDateFormat output = new SimpleDateFormat("dd.M.yyyy HH:mm:ss"); try { Date res = df.parse(date); String formattedTime = output.format(d); // Это результат } catch (ParseException e1) { } если нужно указать язык сделайте так SimpleDateFormat df = new SimpleDateFormat("EEE, dd MMM yyyy hh:mm:ss zzzz", Locale.ENGLISH); Комментарий от CJ1 - Вот оказывается где полный список возможного формата! Ссылка

Ответ 2



Date today = Calendar.getInstance().getTime(); SimpleDateFormat formatter = new SimpleDateFormat("dd.mm.yyyy hh:mm:ss"); String folderName = formatter.format(today); System.out.println(folderName);

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

Как выполнить правильное преобразование строки в дату?

#java #строки #дата #преобразование


Добрый день,читаю из файла строку следующего вида,пытаюсь преобразовать в тип Date.
Не получается. Подскажите, пожалуйста, в чем ошибка. 

String dat ="Sat Jan 03 19:47:23 MSK 1984";
        SimpleDateFormat simpleDateFormat = new SimpleDateFormat();
        simpleDateFormat.applyPattern("EEE MMM dd HH:mm:ss zzz yyyy");
        Date birthDate = simpleDateFormat.parse(dat);


Выкидывает вот такую ошибку:

Exception in thread "main" java.text.ParseException: Unparseable date: "Sat Jan 03
19:47:23 MSK 1984" at java.text.DateFormat.parse(DateFormat.java:366)

    


Ответы

Ответ 1



Все дело в локали: String dat ="Sat Jan 03 19:47:23 MSK 1984"; SimpleDateFormat simpleDateFormat = new SimpleDateFormat("EEE MMM dd HH:mm:ss zzz yyyy", Locale.ENGLISH); Date birthDate = simpleDateFormat.parse(dat);

Ответ 2



Попробуйте так: String str = "Sat Jan 03 19:47:23 MSK 1984"; DateFormat format = new SimpleDateFormat("EEE MMM dd HH:mm:ss zzz yyyy", Locale.ENGLISH); Date date = format.parse(str); Как правильно сказали StateItPrimitive и ЮрийСПб, парсинг даты происходит с учётом локали.

Ответ 3



Кроме вышеперечисленного еще можно добавить, что есть метод ParseExact, который анализирует строку согласно некоторого шаблона

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

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

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


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

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


Ответы

Ответ 1



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

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

Как получить разницу между двумя датами для виджета?

#java #android #дата #android_widgets


Бросил курить 11 октября 2015 года, ровно в 15 часов 20 минут, бросил сигарету и
сказал себе СТОП! По этому поводу решил для себя набросать виджет, что бы каждый раз
при взгляде на главный экран телефона радовал меня моим крутым достижением! 

Набросал проект виджета:



Как мне вместо "Вычисляю..." вывести сколько я уже не курю в формате: Лет Дней Часов
Минут ?

Что нужно вставить вот в этот код:

public class MainActivity extends AppWidgetProvider {

    final String LOG_TAG = "myLogs";

      @Override
      public void onEnabled(Context context) {
        super.onEnabled(context);
        Log.d(LOG_TAG, "onEnabled");
      }

      @Override
      public void onUpdate(Context context, AppWidgetManager appWidgetManager,
          int[] appWidgetIds) {
        super.onUpdate(context, appWidgetManager, appWidgetIds);
        Log.d(LOG_TAG, "onUpdate " + Arrays.toString(appWidgetIds));
      }

      @Override
      public void onDeleted(Context context, int[] appWidgetIds) {
        super.onDeleted(context, appWidgetIds);
        Log.d(LOG_TAG, "onDeleted " + Arrays.toString(appWidgetIds));
      }

      @Override
      public void onDisabled(Context context) {
        super.onDisabled(context);
        Log.d(LOG_TAG, "onDisabled");
      }

}


СПАСИБО!
    


Ответы

Ответ 1



Извиняюсь, пока что не могу прислать в нормальном виде кусок: public static int getDifferenceTimeSeconds(int firstTimeHH, int firstTimeMM, int firstTimeSS, int secondTimeHH, int secondTimeMM, int secondTimeSS){ int firstTime = firstTimeHH*60*60+firstTimeMM*60+firstTimeSS; int secondTime = secondTimeHH*60*60+secondTimeMM*60+secondTimeSS; return firstTime - secondTime; } public static int getDifferenceDateDays(Calendar firstDate, Calendar secondDate){ int firstDateDays = firstDate.get(Calendar.DAY_OF_YEAR); int secondDateDays = secondDate.get(Calendar.DAY_OF_YEAR); return firstDateDays - secondDateDays; }

Как в одной ячейке grid'a вывести 2 даты с разделителем?

#java #gwt #дата #grid #merge


Мне необходимо при выводе информации из бд в одной ячейке таблицы grid выводить 2
даты в формате

dd.MM.yyyy-dd.MM.yyyy 


Первая дата берется из одного поля класса, другая, соответственно, из другого.


    


Ответы

Ответ 1



Вопрос очень размытый, но в первом приближении решение (за исключением названий и методов полей для дат) выглядит вот так: .... dataGrid.addColumn(new TextColumn { public String getValue(DbType dbType) { SimpleDateFormat sdf = new SimpleDateFormat("dd.MM.yyyy"); return sdf.format(dbType.getDate1())+"-"+sdf.format(dbType.getDate2()); } } );

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

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


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


Ответы

Ответ 1



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

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

java Calendar возвращает неправильный день недели

#java #дата #calendar


При программировании на java столкнулся с проблемой, что календарь не всегда правильно
возвращает день недели. Пробовал использовать как Calendar, так и GregorianCalendar,
но результат одинаковый.

Для примера:

GregorianCalendar calendar1 = new GregorianCalendar(196, 0, 1);
System.out.println(calendar1.get(GregorianCalendar.DAY_OF_WEEK));


Результатом в выводе будет 5, хотя по календарю: 01 января 196 - пятница, а значит
мы должны были получить значение 6. Такая же проблема с годами:


1036 (1 января - воскресенье, а возвращает 5)
1316 (1 января - среда, а возвращает 5) 
1456 (1 января - вторник, а возвращает 5)


и др.

Но иногда возвращает и правильные значения. Например:

GregorianCalendar calendar2 = new GregorianCalendar(1600, 0, 1);
System.out.println(calendar2.get(GregorianCalendar.DAY_OF_WEEK));


вернет 7, и по календарю это суббота.
    


Ответы

Ответ 1



Отвечу сам на собственный вопрос. Такая неразбериха с календарями получилась из-за отличий Григорианского и Юлианского календарей. В Юлианском календаре високосный год наступает каждый год, который кратный 4, а в Григорианском - високосными считаются года, которые делятся на 4, но не кратные 100 (за исключением годов, которые делятся на 400). Это означает, что постепенно разница между этими календарями увеличивается на 3 дня каждые 400 лет. Т.к. на Григорианский практически все страны перешли только с 1582 года, то до этого времени все ресурсы и языки программирования (помимо Java сравнивал еще с Python) по-своему высчитывают этот период. Что касается Java, то, как я понял, до 1582 года включительно в языке используется Юлианский календарь, а с 1583 - Григорианский.

Ответ 2



Есть еще один нюанс про который забывает ТС: Calendar defines a locale-specific seven day week using two parameters: the first day of the week and the minimal days in first week (from 1 to 7). These numbers are taken from the locale resource data when a Calendar is constructed. They may also be specified explicitly through the methods for setting their values. Грубо говоря номер дня недели зависит от выбранной локали. В русском календаре первый день недели - понедельник, в западной традиции первый день недели воскресенье.

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

Праздники и выходные

#дата #календарь


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


Ответы

Ответ 1



То, что Вам нужно, называется "Производственный календарь". В итоговом виде он в официальной версии не существует и составляется на основании календаря года и действующего законодательства. Получить его можно, например, с правовых сайтов (Consultant.ru, Garant.ru и пр.), порталов занятости (HH.RU, SuperJob.RU и пр.) и других. Нужен именно сервис, с которого можно получить даты в конкретном формате (XML, JSON), и который не отвалится через год. Портал открытых данных России устроит? Альтернативный источник: ссылка 1, ссылка 2.

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

Как перевести дату и время из Date в секунды от рождества Христова в Java?

#java #дата #localdate


Как перевести дату и время из Date в секунды от рождества Христова?

date.getTime() - возвращает от начала UNIX времени.

Нужно например 2018-12-26 11:39:27 перевести в секунды от 01.01.0001 00:00:00

Уточнение:
Корректнее будет использовать не Date, а Timestamp 
Есть сервис которому нужно передать дату и время в секундах. Этот сервис следующим
методом воспроизводит из секунд обратно в дату и время:

 private String dateConverter(String date) {
            LocalDateTime ldt = LocalDateTime.of(1, Month.JANUARY, 1, 0, 0, 0);
            LocalDateTime resDate = ldt.plusSeconds(Long.parseLong(date));
            return String.valueOf(resDate);
        } 


соответственно дату и время (например 2018-12-26 11:39:27) нужно предварительно перевести
в секунды, с началом исчисления от 01.01.0001 00:00:00 
    


Ответы

Ответ 1



Вот такой код возвращает то, что вам надо: ZonedDateTime localNow = Instant.now().atZone(ZoneOffset.systemDefault()); ZonedDateTime localAtCristsBirth = Instant.parse("0001-01-01T00:00:00.00Z").atZone(ZoneOffset.systemDefault()); Duration timePassed = Duration.between(localAtCristsBirth, localNow); System.out.format("От тождества Христова прошло %d секунд\n", timePassed.getSeconds() ); Уточнение в ответ на уточнение в вопросе: Фактически код, который вы привели, не учитывает временных зон, то есть конвертирует количество секунд, прошедших с момента 0001.01.01 00:00 по местному времени (не важно, какому именно) в дату по тому же самому местному времени. Если это называть количеством секунд "от рождества Христова", то этот код можно признать правильным только в том часовом поясе, в котором Иисус родился. Вот код, который получает Timestamp (раз уж вам так хочется, хотя я не понимаю, зачем вам тут вообще нужен Date или "более корректный" Timestamp) и возвращает именно то, что вам надо (кол-во секунд с 00:00 01.01.01 местного времени в виде строки): package stackoverflow; import java.sql.Timestamp; import java.time.Duration; import java.time.LocalDateTime; import java.time.Month; import java.time.ZoneId; public class Ru_so_941590 { public static void main(String[] args) { Timestamp now = Timestamp.valueOf(LocalDateTime.now()); say("Местное время: " + now); String secondsAD_str = secsWouldHavePassedSinceChtistsBirthIfHeHadBeenBornHere(now); System.out.format("Если бы Спаситель родился здесь, " + "то с момента его рождения прошло бы\n\t\t %,d секунд\n", Long.parseLong(secondsAD_str) ); say("Converted back: " + dateStrFromSecondsAD(secondsAD_str)); } private static String secsWouldHavePassedSinceChtistsBirthIfHeHadBeenBornHere(Timestamp now) { LocalDateTime nowLocal = LocalDateTime.ofInstant(now.toInstant(), ZoneId.systemDefault()); LocalDateTime christsBirthday = LocalDateTime.parse("0001-01-01T00:00:00"); return String.valueOf(Duration.between(christsBirthday, nowLocal).getSeconds()); } private static String dateStrFromSecondsAD(String secondStr) { LocalDateTime christsBirth = LocalDateTime.of(1, Month.JANUARY, 1, 0, 0, 0); LocalDateTime resDate = christsBirth.plusSeconds(Long.parseLong(secondStr)); return String.valueOf(resDate); } static void say(String format, Object... args) { System.out.println(String.format(format, args)); } static void say(String s) { System.out.println(s); } }

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

Преобразование даты Python

#python #дата


Добрый день всем!
Подскажите пожалуйста, как преобразовать полученную дату.
Я получаю с JSON объекта дату в формате (2017-01-29 09:00:00) как мне преобразовать
ее в (01/29 вс 09:00) ?

Заранее благодарен
    


Ответы

Ответ 1



Можно так: In [12]: s = '2017-01-29 09:00:00' In [13]: import datetime In [14]: datetime.datetime.strptime(s, '%Y-%m-%d %H:%M:%S').strftime('%m/%d %a %H:%M') Out[14]: '01/29 Sun 09:00' PS у меня системные настройки английские, поэтому - Sun UPDATE: благодарю @jfs за совет по использованию PyICU, который позволяет динамически поменять локаль в программе, не трогая системных настроек: import datetime import icu s = '2017-01-29 09:00:00' df = icu.SimpleDateFormat('MM/dd eee HH:mm', icu.Locale('ru')) d = datetime.datetime.strptime(s, '%Y-%m-%d %H:%M:%S') print(df.format(d)) Результат: 01/29 вс 09:00

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

Непонятная работа UNIX_TIMESTAMP

#mysql #дата


select UNIX_TIMESTAMP('2008-11-02 00:59:00');
1225601940

select UNIX_TIMESTAMP('2008-11-02 01:00:00');
1225605600

select UNIX_TIMESTAMP('2008-11-02 01:00:00') - UNIX_TIMESTAMP('2008-11-02 00:59:00')
3660

Но UNIX_TIMESTAMP возвращает результат в секундах, почему разница 3660 секунд если
должно быть 60?    


Ответы

Ответ 1



Из UNIX_TIMESTAMP(date) документации: The server interprets date as a value in the current time zone and converts it to an internal value in UTC. emphasize mine то есть 2008-11-02 01:00:00 это не UTC время и поэтому значение UNIX_TIMESTAMP зависит от часового пояса, используемого базой данных (по умолчанию совпадает с поясом, используемым системной временно́й зоной). Часовой пояс может меняться, например, из-за перехода с летнего времени на стандартное (как упомянул @alexander barakin), местное время может прыгнуть на час назад, что увеличивает разницу в данном случае (из двух повторяющихся значений местного времени, выбрано более позднее). Пример, который явно смещение от UTC показывает (на Питоне): >>> import pendulum # $ pip install pendulum >>> dt = pendulum.create(2008, 11, 2, 0, 59, tz='America/New_York') >>> dt.timestamp() 1225601940.0 >>> dt.add(seconds=3660) >>> dt.add(seconds=60) Видно, что моменты времени +00:01:00 и +01:01:00 в будущее имеют одинаковое местное время 1am, но разные часовые пояса (с летнего на зимнее время переход произошёл): >>> dt.add(seconds=60).tzname() 'EDT' >>> dt.add(seconds=3660).tzname() 'EST'

Ответ 2



дата 2008/11/02 — это второе воскресенье ноября, которое в некоторых странах (например, в канаде) является датой перевода часов с летнего на зимнее время (чаще всего именно в час ночи). выбором подобной временно́й зоны на сервере, где выполнялись указанные команды, и можно объяснить разницу в 61 минуту реального времени (измеряемого, в случае unix time stamp, секундами, прошедшими с полуночи первого января 1970 года) между двумя временны́ми отметками 2008-11-02 01:00:00 и 2008-11-02 00:59:00.