Мне очень захотелось поделиться опытом и я хотел бы поговорить о том, почему важно проверять значения возвращаемые функцией. В качестве примера возьмём python и ctypes. Некоторое время назад я столкнулся с достаточно интересным багом суть которого сводилась к тому, что при запуске скрипта на Linux-системе были неправильные данные, но не было трэйсбэка, а на Windows-системе сразу же получали трэйсбэк. Исследование кода показало, что виноваты были некорректные данные даты приходящие в функцию strptime(). Теперь, давайте, посмотрим на пример работы с функцией strptime() в питоне.Читать полностью »
Рубрика «date»
Почему важно проверять значения возвращаемые функцией?
2016-10-14 в 7:07, admin, рубрики: ctypes, date, python, Программирование, разработкаДолгая история про локализацию даты без года в PHP
2016-03-09 в 8:09, admin, рубрики: date, i18n, Intl, php, time, Локализация продуктов Давайте начнём с простой задачки — вывести локализованную дату: там должен быть день, полное название месяца на языке локали и полный год. В наше время это действительно очень просто. В PHP есть своё i18n-расширение intl
, которое входит в ядро с версии 5.3. И в этом intl
есть класс IntlDateFormatter
, у которого в свою очередь предопределено несколько форматов. Используем его LONG
формат.
<?php
foreach (['en_US', 'ru_RU', 'es_ES', 'fa_IR'] as $locale) {
$formatter = new IntlDateFormatter(
$locale,
IntlDateFormatter::LONG,
IntlDateFormatter::NONE,
'Europe/Moscow'
);
echo $formatter->format(1455111783), PHP_EOL;
}
February 10, 2016
10 февраля 2016 г.
10 de febrero de 2016
۱۰ ﻑﻭﺭیﻩٔ ۲۰۱۶ ﻡ. // вот тут вообще-то RTL-текст, но я хз как это правильно оформить
Пока неплохо. А теперь давайте слегка изменим условия: «вывести локализованную дату: там должен быть день и полное название месяца на языке локали». То есть, мы не хотим отображать год.
Читать полностью »
Проблема «7-го января»
2014-12-17 в 12:26, admin, рубрики: chrome, date, Firefox, javascript, Windows 8, баг, браузеры, Веб-разработка Во время работы над одним из проектов обнаружился довольно интересный баг, который, как потом выяснилось, проявляется не только в «самописных» календарях, но и в популярных open-source библиотеках. Проблема заключается в невозможности выбрать 7 января. В некоторых календарях эта дата просто отсутствует:
Если выбирать 6-е число (которое стоит на месте 7-го), то выбирается… 6-е число.
Баг наблюдается (по предварительным оценкам) под Windows 8.
Некоторые подробности под катом.
Читать полностью »
Редкому программисту случается избежать работы с датой и временем. Вообще, дата/время — базовое понятие и в основной массе языков существуют встроенные механизмы работы с этим типом данных. Казалось бы, JS не исключение, есть встроенный тип Date, есть куча функций в прототипе, однако…
Читать полностью »
Отимизируем, оптимизируем и еще раз оптимизируем
2013-08-07 в 7:14, admin, рубрики: date, java, optimization, pattern, truncate, метки: date, java, optimization, pattern, truncate, рандом По долгу службы мне периодически приходится пользоваться профайлером, так как требования к производительности серверов задокументированы и не могут опускаться ниже определенного уровня. Помимо некоторых очевидных архитектурных изменений и решений частенько находятся повторяющиеся места от модуля к модулю, от одного проекта к другому, которые создают дополнительную нагрузку на виртуальную машину, которыми и хочу поделится.
Так уж случилось, что на глаза чаще всего попадался код работы с Date потому с него и начнем:
Date
Не один десяток раз я имел возможность наблюдать, как во время обработки одного запроса от пользователя в нескольких разных местах создается новый объект даты. Чаще всего цель одна и та же — получить текущее время. В простейшем случае это выглядит так:
public boolean isValid(Date start, Date end) {
Date now = new Date();
return start.before(now) && end.after(now);
}
Казалось бы — вполне очевидное и правильное решение. В принципе, да, за исключением двух моментов:
- Использовать Date сегодня в java — уже, пожалуй, моветон, учитывая тот факт, что почти все методы в нем уже Deprecated.
- Нету смысла создавать новый объект даты, если вполне можно обойтись примитивом long:
public boolean isValid(Date start, Date end) {
long now = System.currentTimeMillis();
return start.getTime() < now && now < end.getTIme();
}
SimpleDateFormat
Очень часто в веб проектах возникает задача перевести строку в дату или наоборот дату в строку. Задача довольно типичная и чаще всего выглядит так:
return new SimpleDateFormat("EEE, d MMM yyyy HH:mm:ss Z").parse(dateString);
Это правильное и быстрое решение, но если серверу приходится парсить строку на каждый пользовательский реквест в каждом из сотен потоков — это может ощутимо бить по производительности сервера в виду довольно тяжеловесного конструктора SimpleDateFormat, да и помимо самого форматера создается множество других объектов в том числе и не легкий Calendar (размер которого > 400 байт).
Ситуацию можно было бы легко решить, сделав SimpleDateFormat статическим полем, но он не является потокобезопасным. И в конкурентной среде легко можно словить NumberFormatException.
Вторая мысль — использовать синхронизацию. Но это таки довольно сомнительная вещь. В случае большой конкуренции между потоками, мы можем не просто не улучшить производительность но и ухудшить.
Но решения есть и их как минимум 2:
- Старый, добрый ThreadLocal — cоздаем SimpleDateFormat для каждого потока 1 раз и переиспользуем для каждого последующего запроса. Данный подход поможет ускорить парсинг даты в 2-4 раза за счет избежания создания объектов SimpleDateFormat на каждый запрос.
- Joda и ее потокобезопасный аналог SimpleDateFormat — DateTimeFormat. Хоть йода в целом и медленнее дефолтного Java Date API в парсинге дат они идут наравне. Несколько тестов можно глянуть тут.
Даты в JavaScript: количество дней в месяце и некоторые особенности Safari
2013-04-17 в 16:33, admin, рубрики: date, javascript, snippets, метки: date, javascript, snippetsСобственно, сам сниппет
Не так давно столкнулся с задачей, которая позволила бы получить количество дней в указанном месяце в JavaScript. Штатной функции для этого в языке к сожалению нет.
На эту тему был нагуглен один изящный механизм, использующий одну известную особенность многих языков программирования. Если установить несуществующую дату для какого-либо месяца (например 31 апреля), то в результате нашем объекте будет сохранено соответствующее число следующего месяца (в данном случае — 1 мая).
Таким образом, для того, чтобы получить количество дней в указанном месяце, необходимо отнять результат вышеописанной операции из числа 32. То есть, если задать в качестве даты 32 апреля, в результате мы получим 2 мая. Проверим: 32-2=30 — такое количество дней будет в апреле.
var days_in_april = 32 - new Date(2013, 3, 32).getDate();
Наверное всем иногда приходилось сталкиваться с проблемой перевода времени на локальном компьютере для тестирования программ. Например, вам нужно проверить как сервер обработает платежи через неделю от сегодняшней даты.
Самый простой способ сделать это — подвинуть системное время. Но у него есть несколько недостатков. Некоторые программы, например, Skype, начинают глючить, сохранять сообщения далеко в будущее или в прошлое. Так же системными политиками может быть задано синхронизировать время с корпоративным сервером каждые 5 минут.
Читать полностью »