Java for Beginner
714 subscribers
644 photos
173 videos
12 files
1.01K links
Канал от новичков для новичков!
Изучайте Java вместе с нами!
Здесь мы обмениваемся опытом и постоянно изучаем что-то новое!

Наш YouTube канал - https://www.youtube.com/@Java_Beginner-Dev

Наш канал на RUTube - https://rutube.ru/channel/37896292/
Download Telegram
ZoneOffset, OffsetDateTime и конвертация времени между часовыми поясами

1. Что такое ZoneOffset?

ZoneOffset — это класс, представляющий фиксированное смещение от UTC (Coordinated Universal Time). Он выражается в виде количества часов, минут и секунд, на которые время отличается от UTC.

Например:
+03:00 — смещение на 3 часа вперед от UTC.
-05:00 — смещение на 5 часов назад от UTC.


ZoneOffset используется для работы с временем, которое не зависит от правил временных зон (например, летнего времени). Это особенно полезно, когда вам нужно работать с фиксированным смещением.

Пример создания ZoneOffset:
ZoneOffset offset = ZoneOffset.ofHours(3); // +03:00
System.out.println("ZoneOffset: " + offset);

ZoneOffset offsetWithMinutes = ZoneOffset.ofHoursMinutes(5, 30); // +05:30
System.out.println("ZoneOffset with minutes: " + offsetWithMinutes);


2. Что такое OffsetDateTime?

OffsetDateTime — это класс, представляющий дату и время с фиксированным смещением от UTC. Он объединяет LocalDateTime и ZoneOffset. В отличие от ZonedDateTime, OffsetDateTime не учитывает правила временных зон (например, летнее время).

Пример создания OffsetDateTime:

ZoneOffset offset = ZoneOffset.ofHours(3);
OffsetDateTime offsetDateTime = OffsetDateTime.now(offset);
System.out.println("OffsetDateTime: " + offsetDateTime);


Когда использовать OffsetDateTime?
Когда вам нужно работать с временем, которое имеет фиксированное смещение от UTC.
Когда вам не нужно учитывать правила временных зон (например, летнее время).


3. Конвертация времени между часовыми поясами с помощью withZoneSameInstant()

Метод withZoneSameInstant() позволяет конвертировать время из одного часового пояса в другой, сохраняя момент времени (instant). Это полезно, когда вам нужно отобразить время в другом регионе.

Пример:
ZonedDateTime moscowTime = ZonedDateTime.now(ZoneId.of("Europe/Moscow"));
ZonedDateTime newYorkTime = moscowTime.withZoneSameInstant(ZoneId.of("America/New_York"));
System.out.println("Moscow Time: " + moscowTime);
System.out.println("New York Time: " + newYorkTime);


4. Получение текущего времени в конкретной временной зоне

Чтобы получить текущее время в конкретной временной зоне, используйте ZonedDateTime.now() с указанием ZoneId:
ZonedDateTime moscowTime = ZonedDateTime.now(ZoneId.of("Europe/Moscow"));
ZonedDateTime newYorkTime = ZonedDateTime.now(ZoneId.of("America/New_York"));
System.out.println("Moscow Time: " + moscowTime);
System.out.println("New York Time: " + newYorkTime);


5. Daylight Saving Time (летнее время)

Летнее время — это практика перевода часов на час вперед весной и обратно осенью. Java Time API автоматически учитывает переход на летнее время. Например:
ZonedDateTime beforeDST = ZonedDateTime.of(2023, 3, 26, 1, 59, 0, 0, ZoneId.of("Europe/Moscow"));
ZonedDateTime afterDST = beforeDST.plusMinutes(1);
System.out.println("Before DST: " + beforeDST);
System.out.println("After DST: " + afterDST);


#Java #Training #Medium #Date #ZonedDateTime #OffsetDateTime #withZoneSameInstant
January 21
6. Проверка, действует ли летнее время

Чтобы проверить, действует ли летнее время для конкретной временной зоны в определенный момент, используйте метод isDaylightSavings():
ZoneId zone = ZoneId.of("Europe/Moscow");
ZonedDateTime dateTime = ZonedDateTime.now(zone);
boolean isDST = zone.getRules().isDaylightSavings(dateTime.toInstant());
System.out.println("Is DST active? " + isDST);


Плюсы и минусы работы с ZoneOffset и OffsetDateTime

Плюсы:
Простота: ZoneOffset и OffsetDateTime работают с фиксированным смещением, что упрощает их использование.
Потокобезопасность: Оба класса являются immutable и thread-safe.
Универсальность: OffsetDateTime подходит для случаев, когда не нужно учитывать правила временных зон.


Минусы:
Ограниченность: ZoneOffset не учитывает правила временных зон, такие как летнее время.
Ошибки: Неправильное использование может привести к некорректным результатам, особенно при работе с регионами, где применяется летнее время.


Пример использования ZoneOffset и OffsetDateTime

// Создание ZoneOffset
ZoneOffset offset = ZoneOffset.ofHours(3); // +03:00

// Создание OffsetDateTime
OffsetDateTime offsetDateTime = OffsetDateTime.now(offset);
System.out.println("OffsetDateTime: " + offsetDateTime);

// Конвертация в другой часовой пояс
ZonedDateTime zonedDateTime = offsetDateTime.atZoneSameInstant(ZoneId.of("America/New_York"));
System.out.println("ZonedDateTime in New York: " + zonedDateTime);


#Java #Training #Medium #Date #ZonedDateTime #OffsetDateTime #withZoneSameInstant
January 21
✏️ Цитата дня: Грейс Хоппер

"Лучше сделать и извиниться, чем спрашивать разрешения."


Эта фраза принадлежит Грейс Хоппер, пионеру компьютерных технологий и создательнице первого компилятора. Ее суть — в том, что действие и инициатива важнее бюрократии и страха ошибиться. Хоппер использовала этот подход в своей работе, чтобы ускорять внедрение инноваций и вдохновлять других на смелые шаги.

Отличный повод задуматься: не слишком ли часто мы ждем одобрения, вместо того чтобы действовать?


Почитать био:
https://habr.com/ru/companies/onlinepatent/articles/798795/

#Citation #Biography
Please open Telegram to view this post
VIEW IN TELEGRAM
January 22
📌 Факт дня:

А вы знали что первый компьютерный баг был реальным насекомым?

В 1947 году мотылек застрял в реле компьютера Harvard Mark II, и оператор написала (узнайте кто это) в отчете: "Первый случай обнаружения бага". С тех пор ошибки в программах называют "багами".


#facts
Please open Telegram to view this post
VIEW IN TELEGRAM
January 22
Класс Instant и TemporalAdjusters

Класс Instant и временные метки

Instant — это класс из Java Time API (пакет java.time), который представляет собой точку на временной шкале. Он хранит количество секунд и наносекунд, прошедших с эпохи Unix (1 января 1970 года, 00:00:00 UTC). Это делает его аналогом временных меток (timestamp), которые часто используются в системах для фиксации моментов времени.

Как работает Instant под капотом?


Внутри Instant хранит два поля:
long seconds — количество секунд с эпохи Unix.
int nanos — количество наносекунд (от 0 до 999,999,999), чтобы обеспечить точность до наносекунд.
Методы getEpochSecond() и getNano() позволяют получить эти значения.


Пример использования Instant:
import java.time.Instant;

public class InstantExample {
public static void main(String[] args) {
// Получаем текущий момент времени
Instant now = Instant.now();
System.out.println("Текущий момент: " + now);

// Получаем количество секунд с эпохи Unix
long epochSecond = now.getEpochSecond();
System.out.println("Секунд с эпохи Unix: " + epochSecond);

// Получаем наносекунды
int nano = now.getNano();
System.out.println("Наносекунды: " + nano);
}
}


Плюсы Instant:
Высокая точность (до наносекунд).
Независимость от временных зон (всегда в UTC).
Удобен для хранения и передачи временных меток.


Минусы Instant:
Не подходит для работы с человеко-читаемыми датами и временем (например, "2023-10-15 14:30").
Требует конвертации для отображения в локальных временных зонах.


Использование TemporalAdjusters

TemporalAdjusters — это утилитный класс, который предоставляет готовые методы для выполнения сложных операций с датами. Например, он позволяет находить "следующий понедельник", "последний день месяца" и т.д.

Как работает TemporalAdjusters?

Каждый метод TemporalAdjusters возвращает объект TemporalAdjuster, который можно передать в метод with() классов LocalDate, LocalDateTime и других.

Пример использования TemporalAdjusters:
import java.time.DayOfWeek;
import java.time.LocalDate;
import java.time.temporal.TemporalAdjusters;

public class TemporalAdjustersExample {
public static void main(String[] args) {
// Текущая дата
LocalDate today = LocalDate.now();
System.out.println("Сегодня: " + today);

// Следующий понедельник
LocalDate nextMonday = today.with(TemporalAdjusters.next(DayOfWeek.MONDAY));
System.out.println("Следующий понедельник: " + nextMonday);

// Последний день месяца
LocalDate lastDayOfMonth = today.with(TemporalAdjusters.lastDayOfMonth());
System.out.println("Последний день месяца: " + lastDayOfMonth);
}
}


Плюсы TemporalAdjusters:
Упрощает сложные операции с датами.
Читаемый и понятный код.
Гибкость: можно создавать собственные TemporalAdjuster.


Минусы TemporalAdjusters:
Ограниченный набор стандартных методов (например, нет встроенной поддержки для "первого вторника месяца").
Требует понимания временных типов (LocalDate, LocalDateTime и т.д.).


#Java #Training #Medium #Date #Instant #TemporalAdjusters
January 22
Что выведет код?

public class Task220125_1 {
public static void main(String[] args) {
try {
System.out.println("A");
throw new RuntimeException("B");
} catch (RuntimeException e) {
System.
out.println(e.getMessage());
} finally {
System.out.println("C");
}
}
}


#Tasks
January 22
Сложный выбор... 🧐😵‍💫

https://t.me/Java_for_beginner_dev

#Mems
Please open Telegram to view this post
VIEW IN TELEGRAM
January 22
Работа с временными зонами

Почему важно хранить даты в UTC?

Универсальность: UTC — это стандарт, который не зависит от временных зон.
Согласованность: данные, хранящиеся в UTC, можно легко конвертировать в любую временную зону.
Избежание путаницы: исключаются ошибки, связанные с переходом на летнее время или разными временными зонами.


Пример конвертации из UTC в локальное время:
import java.time.Instant;
import java.time.ZoneId;
import java.time.ZonedDateTime;

public class UTCToLocalTime {
public static void main(String[] args) {
// Текущий момент в UTC
Instant now = Instant.now();
System.out.println("UTC: " + now);

// Конвертация в локальное время (например, для Москвы)
ZonedDateTime localTime = now.atZone(ZoneId.of("Europe/Moscow"));
System.out.println("Московское время: " + localTime);
}
}


Обработка временных зон в веб-приложениях

Как принимать время от пользователя и конвертировать его в UTC?
Принимайте время от пользователя с указанием его временной зоны.
Используйте ZonedDateTime для конвертации в UTC.

Пример:
import java.time.LocalDateTime;
import java.time.ZoneId;
import java.time.ZonedDateTime;

public class UserTimeToUTC {
public static void main(String[] args) {
// Время, введенное пользователем (например, 2023-10-15T14:30)
LocalDateTime userTime = LocalDateTime.parse("2023-10-15T14:30");

// Временная зона пользователя (например, Нью-Йорк)
ZoneId userZone = ZoneId.of("America/New_York");
ZonedDateTime userZonedTime = ZonedDateTime.of(userTime, userZone);

// Конвертация в UTC
ZonedDateTime utcTime = userZonedTime.withZoneSameInstant(ZoneId.of("UTC"));
System.out.println("UTC время: " + utcTime);
}
}


Проблемы с временными зонами

Неоднозначность времени при переходе на летнее время:
Например, в некоторых зонах время 2:30 может быть дважды (при переходе на зимнее время).

Решение:
Используйте ZonedDateTime и методы, которые учитывают такие случаи.

Разные форматы временных зон:
Например, "UTC+3" и "Europe/Moscow" могут означать одно и то же, но лучше использовать стандартные идентификаторы (например, "Europe/Moscow").

Ошибки при конвертации:
Убедитесь, что вы всегда знаете, в какой временной зоне находятся данные.

#Java #Training #Medium #Date #Best_Practicies
January 22
Цитата дня: Линус Торвальдс

"Программирование — это мышление, а не набор инструкций."


Эта фраза принадлежит Линусу Торвальдсу, создателю ядра Linux. Ее суть — в том, что программирование требует не просто знания языков, но и умения мыслить логически, решать задачи и видеть картину в целом. Торвальдс использовал этот подход при разработке Linux, создавая систему, которая стала основой для миллионов технологий.

Отличный повод задуматься: не слишком ли мы сосредоточены на инструментах, забывая о важности мышления?


Почитать био:
https://habr.com/ru/articles/783874/

#Citation #Biography
January 23
📌 Факт дня:

А вы знали, что CAPTCHA — это тест на человечность?

CAPTCHA (Completely Automated Public Turing test to tell Computers and Humans Apart) — это способ доказать, что вы не робот. Интересно, что миллионы людей ежедневно помогают оцифровывать книги, разгадывая искаженные тексты. Так что, если вас попросят "выберите все изображения со светофорами", знайте: вы делаете мир лучше!


#facts
Please open Telegram to view this post
VIEW IN TELEGRAM
January 23
Основные аннотации для работы с датами в Spring

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

1. @DateTimeFormat

Эта аннотация используется для форматирования дат и времени в полях объектов или параметрах методов. Она позволяет указать, как строковое представление даты должно быть преобразовано в объект LocalDate, LocalDateTime и другие типы.

Пример использования:

public class Event {
@DateTimeFormat(pattern = "yyyy-MM-dd")
private LocalDate eventDate;

// Геттеры и сеттеры
}


Здесь поле eventDate будет автоматически преобразовано из строки формата yyyy-MM-dd в объект LocalDate.

Как это работает под капотом:
Spring использует DateTimeFormatAnnotationFormatterFactory для обработки аннотации. Этот фабричный класс создает форматтер, который преобразует строку в объект даты и наоборот.

Плюсы:
Упрощает преобразование строк в даты.
Поддерживает различные форматы дат.


Минусы:
Если формат строки не совпадает с указанным в pattern, возникает исключение.

2. @JsonFormat

Эта аннотация используется для управления сериализацией и десериализацией дат в JSON. Она часто применяется в REST API для корректного отображения дат.

Пример использования:
public class Event {
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "UTC")
private LocalDateTime eventDateTime;

// Геттеры и сеттеры
}


Здесь eventDateTime будет сериализован в JSON в формате yyyy-MM-dd HH:mm:ss и десериализован обратно в объект LocalDateTime.

Как это работает под капотом:
Jackson (библиотека для работы с JSON) использует эту аннотацию для настройки ObjectMapper. Форматтер преобразует дату в строку и обратно.

Плюсы:
Удобно для работы с REST API.
Поддерживает временные зоны.


Минусы:
Требует настройки формата для каждого поля.

3. @Temporal

Эта аннотация используется в JPA для указания типа временного значения (DATE, TIME, TIMESTAMP). Она помогает базе данных правильно интерпретировать даты.

Пример использования:
@Entity
public class Event {
@Temporal(TemporalType.TIMESTAMP)
private Date eventDate;

// Геттеры и сеттеры
}


Здесь eventDate будет сохранен в базе данных как TIMESTAMP.


Как это работает под капотом:
Hibernate (реализация JPA) использует эту аннотацию для определения типа SQL-столбца в базе данных.

Плюсы:
Упрощает работу с датами в базе данных.
Поддерживает различные типы временных данных.


Минусы:
Работает только с устаревшим типом java.util.Date.

#Java #Training #Spring #Date #DateTimeFormat #JsonFormat #Temporal
January 23
Что выведет код?

public class Task230125 {
public static void main(String[] args) {
int i = 0;
do {
System.out.print(i + " ");
i++;
if (i == 3) break;
} while (i < 5);
System.out.print(i);
}
}


#Tasks
January 23
Варианты ответа:
Anonymous Quiz
10%
0 1 2 3 4 5
10%
0 1 2 3 4
27%
0 1 2 2
53%
0 1 2 3
January 23
И ведь не откажешься 😂🥺

https://t.me/Java_for_beginner_dev

#Mems
Please open Telegram to view this post
VIEW IN TELEGRAM
January 23
Продвинутые аннотации и нюансы работы с датами

4. @CreatedDate и @LastModifiedDate

Эти аннотации используются в Spring Data JPA для автоматического управления полями, хранящими дату создания и дату последнего изменения.

Пример использования:
@Entity
public class Event {
@CreatedDate
private LocalDateTime createdAt;

@LastModifiedDate
private LocalDateTime updatedAt;

// Геттеры и сеттеры
}


Поля createdAt и updatedAt автоматически заполняются при создании и обновлении сущности.

Как это работает под капотом:
Spring Data JPA использует AuditingEntityListener для отслеживания изменений сущностей и автоматического заполнения этих полей.

Плюсы:
Упрощает управление временными метками.
Не требует ручного обновления полей.


Минусы:
Требует настройки аудита в конфигурации Spring.

5. @Scheduled

Эта аннотация используется для запуска задач по расписанию. Она поддерживает работу с датами и временем для выполнения задач в определенные моменты.

Пример использования:
@Component
public class EventScheduler {
@Scheduled(cron = "0 0 12 * * ?") // Запуск каждый день в 12:00
public void scheduleEvent() {
System.out.println("Event scheduled at: " + LocalDateTime.now());
}
}


Как это работает под капотом:
Spring использует TaskScheduler для выполнения методов, помеченных этой аннотацией, в соответствии с указанным расписанием.

Плюсы:
Удобно для выполнения периодических задач.
Поддерживает сложные расписания через cron.


Минусы:
Требует настройки пула потоков для выполнения задач.

6. Нюансы работы с датами

Временные зоны: Всегда учитывайте временные зоны при работе с датами. Используйте
@JsonFormat(timezone = "UTC") или ZonedDateTime.
Иммутабельность: Классы дат в Java (например, LocalDate, LocalDateTime) являются неизменяемыми. Это означает, что любые операции возвращают новый объект.
Сериализация: При работе с REST API убедитесь, что даты сериализуются и десериализуются в правильном формате.


#Java #Training #Spring #Date #CreatedDate #LastModifiedDate #Scheduled
January 23
👩‍💻 29 лет с момента выхода JDK 1.0

Ровно 29 лет назад, 23 января 1996 года, вышла первая мажорная версия JDK и с тех пор Java прочно заняла место рядах языков программирования.

С днем рождения, Java!
Please open Telegram to view this post
VIEW IN TELEGRAM
January 23
Цитата дня: Джеймс Гослинг

"Java — это C++, из которого убрали все пистолеты, ножи и дубинки."


Эта фраза принадлежит Джеймсу Гослингу, создателю языка программирования Java. Он использовал это сравнение в интервью в 1995–1996 годах, чтобы подчеркнуть, что Java была разработана как более безопасный и простой язык по сравнению с C++. Гослинг хотел убрать сложные и потенциально опасные элементы C++, такие как ручное управление памятью и множественное наследование, чтобы сделать Java более доступной и надежной для разработчиков.

Отличный повод задуматься: как мы можем упрощать технологии, чтобы они становились более безопасными и удобными для использования?


Почитать био:

https://habr.com/ru/companies/jugru/articles/502062/

#Citation #Biography
January 24
📌 Факт дня:

А вы знали, что пароль '123456' до сих пор популярен?

Несмотря на все предупреждения о кибербезопасности, миллионы людей используют этот пароль. Видимо, они думают: "Кто будет взламывать мою учетку? У меня там только котики в Instagram!"


#facts
Please open Telegram to view this post
VIEW IN TELEGRAM
January 24
Продолжаем серию постов для углубления недостаточно рассмотренных и актуальных тем.

Функциональное программирование

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

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


Основные принципы функционального программирования

Неизменяемость (Immutability):
В ФП данные не изменяются после создания. Вместо этого создаются новые данные на основе существующих.

Преимущества:
Упрощение отладки и тестирования.
Потокобезопасность (нет состояния, которое может быть изменено несколькими потоками).


Недостатки:
Может потреблять больше памяти, так как создаются новые объекты вместо изменения существующих.

Пример:
// Императивный стиль (изменяемый)
List<String> list = new ArrayList<>();
list.add("Java");
list.add("Kotlin");

// Функциональный стиль (неизменяемый)
List<String> immutableList = List.of("Java", "Kotlin");


Чистые функции (Pure Functions):

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

Преимущества:
Предсказуемость и простота тестирования.
Упрощение параллельного выполнения.


Недостатки:
Иногда сложно избежать побочных эффектов в реальных приложениях.

Пример:
// Чистая функция
public static int add(int a, int b) {
return a + b;
}

// Нечистая функция (имеет побочный эффект)
public static int addAndLog(int a, int b) {
System.out.println("Adding " + a + " and " + b); // Побочный эффект
return a + b;
}


Функции высшего порядка (Higher-Order Functions):

Это функции, которые могут принимать другие функции в качестве аргументов или возвращать их.

Преимущества:
Гибкость и возможность создания абстракций.

Недостатки:
Может быть сложнее для понимания новичкам.

Пример:
// Функция высшего порядка
public static <T> List<T> filter(List<T> list, Predicate<T> predicate) {
List<T> result = new ArrayList<>();
for (T item : list) {
if (predicate.test(item)) {
result.add(item);
}
}
return result;
}

// Использование
List<Integer> numbers = List.of(1, 2, 3, 4, 5);
List<Integer> evenNumbers = filter(numbers, n -> n % 2 == 0); // [2, 4]


Полезная для понимания вопроса, статья - https://habr.com/ru/articles/570642/

#Java #Training #Medium #Functional_programming
January 24