як створити об'єкт Java Date опівночі сьогодні та півночі завтра?


178

У своєму коді мені потрібно знайти всі мої речі, які відбулися сьогодні. Тому мені потрібно порівняти дати від сьогодні о 00:00 (півночі рано вранці) до 12:00 (півночі сьогодні вночі).

Я знаю ...

Date today = new Date(); 

... отримує мене прямо зараз. І ...

Date beginning = new Date(0);

... отримує мене нульовий час 1 січня 1970 року. Але який найпростіший спосіб отримати нульовий час сьогодні і нульовий час завтра?

ОНОВЛЕННЯ; Я це зробив, але напевно є простіший спосіб?

Calendar calStart = new GregorianCalendar();
calStart.setTime(new Date());
calStart.set(Calendar.HOUR_OF_DAY, 0);
calStart.set(Calendar.MINUTE, 0);
calStart.set(Calendar.SECOND, 0);
calStart.set(Calendar.MILLISECOND, 0);
Date midnightYesterday = calStart.getTime();

Calendar calEnd = new GregorianCalendar();
calEnd.setTime(new Date());
calEnd.set(Calendar.DAY_OF_YEAR, calEnd.get(Calendar.DAY_OF_YEAR)+1);
calEnd.set(Calendar.HOUR_OF_DAY, 0);
calEnd.set(Calendar.MINUTE, 0);
calEnd.set(Calendar.SECOND, 0);
calEnd.set(Calendar.MILLISECOND, 0);
Date midnightTonight = calEnd.getTime();

3
На мою думку, Joda Time простіше, подивіться наприкінці моєї відповіді. Якщо ви хочете використовувати java.util.Date/Calendar, ви повинні зробити це таким чином, немає більш простого способу зробити це.
timaschew

RE: коментар timaschew для використання Joda-Time, знайте, що проект Joda-Time зараз перебуває в режимі обслуговування, і радить міграцію до класів java.time.
Василь Бурк

1
FYI, жахливі старі класи дату, такі як java.util.Date, java.util.Calendarі java.text.SimpleDateFormatтепер застарілі , витіснені класами java.time, вбудованими в Java 8 та новіших версій. Дивіться Підручник від Oracle .
Василь Бурк

2
Рідко можна побачити стільки недосконалих відповідей на питання, як на це. Рекомендую відповідь Василя Бурка , вона правильна і знаюча.
Оле ВВ

Відповіді:


344

java.util.Calendar

// today    
Calendar date = new GregorianCalendar();
// reset hour, minutes, seconds and millis
date.set(Calendar.HOUR_OF_DAY, 0);
date.set(Calendar.MINUTE, 0);
date.set(Calendar.SECOND, 0);
date.set(Calendar.MILLISECOND, 0);

// next day
date.add(Calendar.DAY_OF_MONTH, 1);

JDK 8 - java.time.LocalTime та java.time.LocalDate

LocalTime midnight = LocalTime.MIDNIGHT;
LocalDate today = LocalDate.now(ZoneId.of("Europe/Berlin"));
LocalDateTime todayMidnight = LocalDateTime.of(today, midnight);
LocalDateTime tomorrowMidnight = todayMidnight.plusDays(1);

Joda-Time

Якщо ви використовуєте JDK <8, рекомендую Joda Time , тому що API дуже приємний:

DateTime date = new DateTime().toDateMidnight().toDateTime();
DateTime tomorrow = date.plusDays(1);

Починаючи з версії 2.3 Joda часу DateMidnightє застарілим , так що використовуйте це:

DateTime today = new DateTime().withTimeAtStartOfDay();
DateTime tomorrow = today.plusDays(1).withTimeAtStartOfDay();

Пропустіть часовий пояс, якщо ви не бажаєте поточного часового поясу JVM за замовчуванням.

DateTimeZone timeZone = DateTimeZone.forID("America/Montreal");
DateTime today = new DateTime(timeZone).withTimeAtStartOfDay(); // Pass time zone to constructor.

Дякую за допомогу, я тільки що оновив своє первісне запитання щодо того, як я це роблю в даний час. Дякую за пропозицію.

3
Станом на JodaTime 2.3, toDateMidnightзастарілий. Детальніше див. У цій відповіді: stackoverflow.com/a/19048833/363573
Стефан

додав рішення для JDK 8
timaschew

1
@timaschew Хоча в цілому правильно, я пропоную зробити java.time, використовуючи зоноване значення дати ( ZonedDateTime), як ви робили в розділі Joda-Time. Ці Local…типи не мають інформації про часовий пояс - це їх ціле призначення, не втрачайте / ігноруйте всі відомості про зміщення та часовий пояс. Тим більше, що Питання говорить про використання цих значень для порівняння (можливо, запити до бази даних?), Зоноване значення дати та часу, ймовірно, буде кориснішим.
Василь Бурк

1
@Amalgovinus Не забудьте встановити Calendar.HOUR_OF_DAY, а не Calendar.HOUR.
Освальд

43

Для повноти, якщо ви використовуєте Java 8, ви також можете використовувати truncatedToметод Instantкласу, щоб отримати півночі в UTC .

Instant.now().truncatedTo(ChronoUnit.DAYS);

Як написано в Javadoc

Наприклад, обрізання з одиницею MINUTES округлятиметься до найближчої хвилини, встановлюючи секунди та наносекунди до нуля.

Сподіваюся, це допомагає.


1
Дякую за підказку. Date.from(date.toInstant().atZone(ZoneId.systemDefault()).truncatedTo(ChronoUnit.DAYS).toInstant())
Дістання


33

Найпростіший спосіб знайти півночі:

Long time = new Date().getTime();
Date date = new Date(time - time % (24 * 60 * 60 * 1000));

Наступного дня:

Date date = new Date(date.getTime() + 24 * 60 * 60 * 1000);

Я запустив цей код і отримав: Опівночі: Четвер 01 листопада 19:00:00 CDT 2012
Дейв

3
Якщо ви зробили щось на кшталт System.out.print (дата), система перетворила екземпляр дати в часовий пояс системи (CDT). 19:00 у CDT опівночі в GMT. Якщо вам потрібна опівночі у вибраному часовому поясі, вам слід додати зміщення цього часового поясу, враховуючи DST.
Андрій Волгін

@Bouncner Це так. На Землі існує багато різних "півночних" часів незалежно від того, який метод ви використовуєте, але є лише одна півночі на Java.
Андрій Волгін

2
@Andrei Volgin Не знав, що є "південь півдня". ;) Що я хотів сказати, що це рішення насправді не допомагає творцю теми. Календарне рішення дозволяє уникнути некрасивих другорядних обчислень і піклується про часові пояси (і особливо на денний час економії світла тощо) при правильному використанні. Я не бачу цього у вашому рішенні.
Bouncner

Привіт @AndreiVolgin, я отримав з датою дата = нова дата (час + TimeZone.getDefault (). GetRawOffset () - час% (24 * 60 * 60 * 1000));
jrey

28

Пам'ятайте, Dateне використовується для позначення дат (!). Щоб представити дату, вам потрібен календар. Це:

Calendar c = new GregorianCalendar();

створить Calendarекземпляр, що представляє поточну дату у вашому поточному часовому поясі. Тепер вам потрібно обрізати кожне поле нижче дня (години, хвилини, секунди та мілісекунди), встановивши його на 0. У вас сьогодні півночі.

Тепер, щоб отримати наступну півночі, потрібно додати один день:

c.add(Calendar.DAY_OF_MONTH, 1);

Зауважте, що додавання 86400секунд або 24 годин є неправильним через літній час, який може відбутися тим часом.

ОНОВЛЕННЯ: Однак моїм улюбленим способом вирішення цієї проблеми є використання класу DateUtils від Commons Lang :

Date start = DateUtils.truncate(new Date(), Calendar.DAY_OF_MONTH))
Date end = DateUtils.addDays(start, 1);

Він використовується Calendarза лаштунками ...


15
Дякую за допомогу. "Дата не використовується для позначення дат" - ми це досить чудово-блискуче, чи не так? ;)

@RobertHume Чесно кажучи, Дата існувала з моменту першого випуску Java. Більшість речей з тієї епохи є ... менш ніж ідеально продуманими. Тим більше, що Java була однією з перших, хто спробував усілякі речі, що намагався, і далеко не було узгодженого стандарту, як це зробити.
Фонд позову Моніки

14

ці методи допоможуть вам -

public static Date getStartOfDay(Date date) {
     Calendar calendar = Calendar.getInstance();
     calendar.setTime(date);
     calendar.set(Calendar.HOUR_OF_DAY, 0);
     calendar.set(Calendar.MINUTE, 0);
     calendar.set(Calendar.SECOND, 0);
     calendar.set(Calendar.MILLISECOND, 0);
     return calendar.getTime();
 }

і

public static Date getEndOfDay(Date date) {
    Calendar calendar = Calendar.getInstance();
    calendar.setTime(date);
    calendar.set(Calendar.HOUR_OF_DAY, 23);
    calendar.set(Calendar.MINUTE, 59);
    calendar.set(Calendar.SECOND, 59);
    calendar.set(Calendar.MILLISECOND, 999);
    return calendar.getTime();
}

9

Станом на JodaTime 2.3 toDateMidnight()застарілий.

Від оновлення з 2,2 до 2,3

    Позбавлення від 2.2
    ----------------------
    - DateMidnight [# 41]
     Цей клас є недоліком у концепції
     Час опівночі в деяких часових поясах не відбувається
     Це результат літнього часу з 00:00 до 01:00
     DateMidnight - це, по суті, DateTime із часом, заблокованим до півночі
     Така концепція, як правило, є поганою у використанні для LocalDate
     Замініть DateMidnight на LocalDate
     Або замініть його DateTime, можливо, використовуючи метод withTimeAtStartOfDay ()

Ось зразок коду без toDateMidnight()методу.

Код

DateTime todayAtMidnight = new DateTime().withTimeAtStartOfDay();
System.out.println(todayAtMidnight.toString("yyyy-MM-dd HH:mm:ss"));

Вихідні дані ( можуть бути різними залежно від місцевого часового поясу )

2013-09-28 00:00:00

2
Відмінна відповідь. Я хотів би додати передачу DateTimeZoneекземпляра до цього DateTimeконструктора, щоб наголосити на важливості визначення часового поясу, а не ненароком залежно від типових умов:DateTimeZone timeZone = DateTimeZone.forID( "Europe/Paris" );
Василь Бурк

9

Інші відповіді правильні, особливо відповідь java.time від arganzheng . Як згадували деякі, вам слід уникати старих класів java.util.Date/.Calendar, оскільки вони погано розроблені, заплутані та клопітні. Вони були витіснені класами java.time.

Дозвольте додати зауваження щодо стратегії довкола обробки півночі та проміжків часу .

Напіввідкритий

У роботі з датою часу проміжки часу часто визначаються за допомогою підходу «Напіврозкриття». У такому підході початок є інклюзивним, а закінчення є виключним . Це вирішує проблеми, а якщо послідовно використовувати їх, значно полегшується міркування щодо обробки вашої дати.

Одна з вирішених проблем - визначення кінця дня. Останній момент дня 23:59:59.999( мілісекунд )? Можливо, у класі java.util.Date (від найдавнішої Java; клопітно - уникайте цього класу!) Та у дуже успішній бібліотеці Joda-Time . Але в інших програмах, таких як база даних, як Postgres, останнім моментом буде 23:59:59.999999( мікросекунди ). Але в іншому програмному забезпеченні, такому як java.time Framework (вбудований у Java 8 і пізніші версії, наступник Joda-Time), а також у деяких базах даних, таких як база даних H2 , останнім моментом може бути 23:59.59.999999999( наносекунд ). Замість того, щоб розщеплювати волосся, подумайте лише з точки зору першого моменту, а не останнього моменту.

У Half-Open день проходить з першого моменту одного дня і закінчується, але не включає першого моменту наступного дня. Тож ніж думайте так:

… З сьогодні о 00:00 (півночі рано вранці) до 12:00 (півночі сьогодні вночі).

… Думай так…

від першого моменту сьогоднішнього дня до, але не враховуючи першого моменту завтра:
(> = 00:00:00.0сьогодні AND < 00:00:00.0завтра)

У роботі з базою даних цей підхід означає не використовувати BETWEENоператора в SQL.

Початок дня

Крім того, перший момент дня - це не завжди час дня 00:00:00.0. Перехід на літній час (DST) у деяких часових поясах та, можливо, в інші аномалії, може означати, що день починається з іншого часу.

Тож нехай заняття java.time виконують роботу щодо визначення початку дня із закликом до LocalDate::atStartOfDay( ZoneId ). Тож нам доведеться виїжджати через LocalDateта назад, ZonedDateTimeяк ви бачите в цьому прикладі коду.

ZoneId zoneId = ZoneId.of( "America/Montreal" );
ZonedDateTime now = ZonedDateTime.now( zoneId );
ZonedDateTime todayStart = now.toLocalDate().atStartOfDay( zoneId );
ZonedDateTime tomorrowStart = todayStart.plusDays( 1 );

Зверніть увагу на проходження додатково ZoneId. Якщо опущений поточний часовий пояс вашого JVM, застосовано неявно. Краще бути явним.

Часовий пояс має вирішальне значення для роботи часу та часу. Питання та деякі відповіді можуть бути помилковими, оскільки свідомо не обробляють часовий пояс.

Перетворити

Якщо вам потрібно використовувати java.util.Date або .Calendar, шукайте нові методи перетворення, додані до цих старих класів.

java.util.Date utilDate = java.util.Date.from( todayStart.toInstant() );
java.util.GregorianCalendar gregCal = java.util.GregorianCalendar.from( todayStart );

Проміжок часу

До речі, якщо ви багато працюєте з відрізками часу, подивіться на:

  • Duration
  • Period
  • Interval
    IntervalКлас знаходиться в ThreeTen-Extra проекту, розширення в рамках java.time. Цей проект є передумовою для можливих майбутніх доповнень до java.time.
    Interval todayMontreal = Interval.of( todayStart.toInstant() , tomorrowStart.toInstant() );

Про java.time

Java.time каркас вбудований в Java 8 і пізніших версій. Ці класи витісняти неприємні старі застарілі класи дати і часу , такі як java.util.Date, Calendar, і SimpleDateFormat.

Проект Joda-Time , який зараз знаходиться в режимі обслуговування , радить перейти до класів java.time .

Щоб дізнатися більше, дивіться навчальний посібник Oracle . І шукайте переповнення стека за багатьма прикладами та поясненнями. Специфікація - JSR 310 .

Ви можете обмінюватися об'єктами java.time безпосередньо зі своєю базою даних. Використовуйте драйвер JDBC, сумісний з JDBC 4.2 або пізнішої версії. Немає потреби в струнах, немає потреби в java.sql.*заняттях.

Де отримати класи java.time?

Проект ThreeTen-Extra розширює java.time додатковими класами. Цей проект є передумовою для можливих майбутніх доповнень до java.time. Ви можете знайти деякі корисні класи тут , такі як Interval, YearWeek, YearQuarter, і більш .


6

java.time

Якщо ви використовуєте Java 8 та новіші версії, ви можете спробувати пакет java.time ( Підручник ):

LocalDate tomorrow = LocalDate.now().plusDays(1);
Date endDate = Date.from(tomorrow.atStartOfDay(ZoneId.systemDefault()).toInstant());

2
Хороша відповідь. Я б запропонував вказати бажаний / очікуваний часовий пояс. Поточний часовий пояс JVM за замовчуванням може змінюватися залежно від налаштувань ОС, зміни комп’ютерів або будь-якої програми в будь-якій течі JVM, що змінює типовий стан у будь-який момент під час виконання.
Василь Бурк

4

Здається, це варіант:

DateFormat justDay = new SimpleDateFormat("yyyyMMdd");
Date thisMorningMidnight = justDay.parse(justDay.format(new Date()));

додати до нього і день

Date tomorrow = new Date(thisMorningMidnight.getTime() + 24 * 60 * 60 * 1000);

або

Calendar c = Calendar.getInstance();
c.setTime(thisMorningMidnight);
c.add(Calendar.DATE, 1);
Date tomorrowFromCalendar = c.getTime();

У мене є думка, що останній вважається кращим у випадку чогось такого дивного, як економія денного світла, що призводить до недостатнього додання 24 годин (див. Https://stackoverflow.com/a/4336131/32453 та інші його відповіді).


У мене в базі даних sqlite відображаються дата і час дня. Мені потрібно отримати довго до початку наступного дня. Чи можу я все-таки використовувати об’єкт Date своїм довгим, а не методом SimpleDateFormat, який ви використовуєте вище?
AJW

1
Поки це правильні мілісекунди, ви можете передавати його як конструктор: docs.oracle.com/javase/7/docs/api/java/util/…
rogerdpack

1

Я робив це інакше, ніж всі інші тут. Я новачок у Java, тому, можливо, моє рішення погано.

Date now = new Date();
Date midnightToday = new Date(now.getYear(), now.getMonth(), now.getDate());

Я не впевнений, що це ще працює, але в будь-якому випадку я буду вдячний за будь-який відгук про це рішення.

Мене бентежить твердження вище, що завтра можна розрахувати, зателефонувавши:

c.add(Calendar.DAY_OF_MONTH, 1);

Якщо ви додасте 1 до дня місяця, і це 31-й день, чи не ви отримаєте 32-й день місяця?

Чому час / дати не всі базуються на UTC на Java? Я думаю, що часові пояси потрібні лише при використанні вводу-виводу, але внутрішньо завжди слід використовувати в UTC. Однак класи, як видається, включають інформацію про часову зону, яка здається не тільки марною, але схильною до помилок кодування.


2
Привіт Мітч. Я думаю, що ваше рішення працює, але схоже, що конструктор Date застарів. Люди з Java застаріли більшість оригінальних методів, пов’язаних з датою, і замінили їх новішими методами, пов’язаними з Календарем. Особисто я не бачу, як це поліпшення, але нахмурилося використовувати застарілі методи. Дякую!

Сумно з приниженням. Мені здається набагато більш чистим вказати рік, місяць і дату, а не очищати годину, хвилину, секунду та мілісек. Очищення цих функцій покладається на мілісексуали, які є найтоншою деталізацією класу Дата, в той час як моє рішення не робить. Моє рішення також коротше і чіткіше. Навіть новинку в Java змушує мене дуже цінувати те, наскільки чистим, легким та ефективним є C ++, коли справа стосується використання дати та часу.
Мітч

@Mitch На мій досвід, найновіша мова, яку ти вивчаєш, завжди сприймається як найскладніша.
ArtOfWarfare

FYI: ці криваві жахливі старі класи на сьогоднішній день тепер успадковані, замінені сучасними класами java.time.
Василь Бурк


0

Найпростіший спосіб з JodaTime

DateMidnight date = DateMidnight.now();


2
Ні. Класи та методи, пов’язані з "опівночі" в Joda-Time, були застарілими. Вони базувалися на хибній концепції. Перший момент дня - це не завжди 00:00:00.000. Замість цього використовуйте новий withTimeAtStartOfDayметод. Оновіть до поточної версії 2.4 Joda-Time та прочитайте нотатки до випуску. Приклад:DateTime today = DateTime.now( DateTimeZone.forID( "America/Montreal" ) ).withTimeAtStartOfDay();
Василь Бурк

0

Через те, що один день є 24 * 60 * 60 * 1000мс, півночі цього дня можна обчислити як ...

long now = System.currentTimeMillis();
long delta = now % 24 * 60 * 60 * 1000;
long midnight = now - delta;
Date midnightDate = new Date(midnight);`

1
Цей код застосовується лише до UTC та жодного іншого часового поясу та ігнорує аномалії, такі як літній час. Крім того, рішення про власні дати та час не є розумним, оскільки це напрочуд складна тема. Використовуйте натомість чудові класи java.time.
Василь Бурк

0

Приблизно, як відповіді раніше, але ніхто не згадав параметр AM_PM:

    Calendar cal = Calendar.getInstance();
    cal.set(Calendar.HOUR, 0);
    cal.set(Calendar.MINUTE, 0);
    cal.set(Calendar.SECOND, 0);
    cal.set(Calendar.MILLISECOND, 0);
    cal.set(Calendar.AM_PM, Calendar.AM);

1
Клопітно Calendarклас був витіснений років тому в java.time класів, в зокрема ZonedDateTime.
Василь Бурк

0
Date now= new Date();
// Today midnight
Date todayMidnight = new Date(endTime.getTime() -endTime.getTime()%DateUtils.MILLIS_PER_DAY);

// tomorrow midnight
Date tomorrowMidnight = new Date(endTime.getTime() -endTime.getTime()%DateUtils.MILLIS_PER_DAY + DateUtils.MILLIS_PER_DAY);

Це працює лише за UTC і не вдається вирішити часові пояси. Також жахливий Dateклас витіснився роками тому java.time.Instant. Уникайте використання Dateсьогодні.
Василь Бурк

0

Використання спільноти apache ..

//For midnight today 
Date today = new Date(); 
DateUtils.truncate(today, Calendar.DATE);

//For midnight tomorrow   
Date tomorrow = DateUtils.addDays(today, 1); 
DateUtils.truncate(tomorrow, Calendar.DATE);

FYI, жахливі старі класи дату, такі як java.util.Date, java.util.Calendarі java.text.SimpleDateFormatтепер застарілі , витіснені класами java.time, вбудованими в Java 8 та новіших версій. Дивіться Підручник від Oracle .
Василь Бурк

@BasilBourque Погодився на Java 8. Але якщо OP використовує Java 7, я думаю, все одно це буде працювати.
joe4java

Майже весь функціонал java.time доступний для Java 6 та 7 в проекті ThreeTen-Backport з практично однаковим API. Далі адаптовано для Android <26 у проекті ThreeTenABP . Тому більше не потрібно використовувати ці жалюгідні старі класи.
Василь Бурк

-1

Я знаю, що це дуже стара посада. Я думав поділитися своїми знаннями тут!

Для дати Середня ніч сьогодні з точним часовим поясом ви можете використовувати наступне

public static Date getCurrentDateWithMidnightTS(){

    return new Date(System.currentTimeMillis() - (System.currentTimeMillis()%(1000*60*60*24)) - (1000*60 * 330));
}

Де (1000*60 * 330)віднімається, тобто фактично пов'язане з часовим поясом, наприклад, індійський часовий пояс, тобто колката відрізняється +5: 30 годин від фактичного. Отже, віднімаючи це з перетворенням у мілісекунди.

Тож змініть останнє відмінене число відповідно до вас. Я створюю продукт, тобто базується лише в Індії. Тому я просто використовував певні часові позначки.


1
Чому б ви запропонували це замість прийнятої відповіді? Зміна значень дати та часу в цілому ризикована. Зокрема, цей код назавжди жорстко кодується до поточного зміщення одного часового поясу. Літній час та інші аномалії не обліковуються. Я бачу лише недоліки без додаткової вартості.
Василь Бурк

@Basil Звичайно, я приймаю відповідь, і так, я там згадував про важко кодованому значенні. Це корисно лише у випадку, коли ви працюєте у певному часовому поясі.
Радєєв

-1
Date todayMidnightUTC = java.sql.Date.valueOf(LocalDate.now());
Date tomorrowMidnightUTC = java.sql.Date.valueOf(LocalDate.now().plusDays(1));
Date anyMidnightLocal = java.sql.Date.valueOf(LocalDate.from(dateTime.toInstant().atZone(ZoneId.systemDefault())));

Але будьте обережні, що java.sql.Date.toInstant()завжди кидає UnsupportedOperationException.

Через LocalDate в java.util.Date і навпаки найпростіша конверсія?


Недобра відповідь. Ви змішуєте використання сучасного java.time зі старими спадковими класами, які вони витісняють. А конкретно, ви використовуєте класи дати-часу java.sql, які слід використовувати лише для обміну даними з базою даних, драйвер яких ще не оновлено для роботи безпосередньо з класами java.time, і ніколи не використовуватися для ділової логіки. Ще одна проблема полягає в тому, що ви ігноруєте вирішальну проблему часового поясу.
Василь Бурк

@BasilBourque, дякую за критику. Використання одного старого класу, який не позначений як застарілий, щоб отримати інший екземпляр старого класу, є досить безпечним. Питання часового поясу важливіше. Я вирішив дотримуватися Ріккардо в відповідь врешті-решт.
Вадим

-1

Старомодний спосіб ..

private static Date getDateWithMidnight(){
    long dateInMillis = new Date().getTime();
    return new Date(dateInMillis - dateInMillis%(1000*60*60*24) - TimeZone.getDefault().getOffset(dateInMillis));
}

Цей клопіткий клас був витіснений роками тому класом java.time.Instant . Ніколи не потрібно використовувати Date.
Василь Бурк

Цей Dateклас завжди в UTC. Тож ви ігноруєте питання бажаного / очікуваного часового поясу. Наприклад, новий день світиться в Індії в Калькутті на багато годин раніше, ніж у UTC, і на години пізніше, ніж UTC у Монреалі Квебеку.
Василь Бурк
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.