JavaRush /Блоги Java /Random-TG /Чӣ тавр дар вақт гум нашавед - DateTime ва Calendar

Чӣ тавр дар вақт гум нашавед - DateTime ва Calendar

Дар гурӯҳ нашр шудааст
Салом! Имрӯз мо ба кор бо як навъи нави маълумоте, ки қаблан дучор нашуда будем, яъне санаҳоро оғоз мекунем. Чӣ тавр дар вақт гум нашавед - DateTime ва Calendar - 1Ба фикрам ҳоҷат ба тавзеҳ додани сана нест :) Аслан, дар Java дар сатри муқаррарӣ навиштани сана ва вақти ҷорӣ комилан имконпазир аст.
public class Main {
   public static void main(String[] args) {

       String date = "June 11, 2018";
       System.out.println(date);
   }
}
Аммо ин усул камбудиҳои зиёде дорад. Синф Stringбарои кор бо матн сохта шудааст ва он усулҳои мувофиқ дорад. Агар ба мо лозим ояд, ки бо ягон роҳ санаро идора кунем (масалан, ба он 2 соат илова кунед), он Stringдар ин ҷо кор намекунад. Ё, масалан, сана ва вақти ҷорӣро дар вақти дар консол тартиб додани барнома намоиш диҳед. Он дар ин ҷо Stringҳам кӯмак намекунад: ҳангоми навиштани рамз ва иҷро кардани он, вақт тағир меёбад ва номувофиқ дар консол нишон дода мешавад. Аз ин рӯ, дар Java, созандагони он барои кор бо санаҳо ва вақтҳо якчанд синфҳо пешниҳод карданд. Аввалин синф астjava.util.Date

Синфи санаи Java

Мо ба он номи пурраи онро додем, зеро дар бастаи дигар дар Java синф низ ҳаст java.sql.Date. Ошуфта нашавед! Аввалин чизе, ки шумо бояд дар бораи он донед, он аст, ки он санаро дар миллисонияҳо нигоҳ медорад , ки аз 1 январи соли 1970 гузаштааст. Ҳатто номи алоҳида барои ин сана вуҷуд дорад - "Unix time". Як роҳи ҷолиб, оё шумо розӣ нестед? :) Чизи дуюме, ки бояд дар хотир дошт: агар шумо an objectеро Dateбо конструктори холӣ созед, натиҷа сана ва вақти ҷорӣ дар вақти сохтани an object хоҳад буд . StringОё шумо дар хотир доред, ки мо чӣ гуна навишта будем, ки чунин вазифа барои формати сана мушкил хоҳад буд? Синф Dateонро ба осонӣ ҳал мекунад.
public class Main {
   public static void main(String[] args) {

       Date date = new Date();
       System.out.println(date);
   }
}
Ин рамзро якчанд маротиба иҷро кунед ва шумо хоҳед дид, ки ҳар дафъа вақт чӣ гуна тағйир меёбад :) Ин маҳз аз он сабаб имконпазир аст, ки он дар миллисонияҳо нигоҳ дошта мешавад: онҳо хурдтарин воҳиди вақт мебошанд, бинобар ин натиҷаҳо хеле дақиқанд. Барои : дигар конструктор вуҷуд дорад Date: шумо метавонед шумораи дақиқи миллисонияҳоро, ки аз соати 00:00 1 январи соли 1970 то санаи зарурӣ гузаштаанд, муайян кунед ва он офарида мешавад:
public class Main {
   public static void main(String[] args) {

       Date date = new Date(1212121212121L);
       System.out.println(date);
   }
}
Натиҷаи консол:

Fri May 30 08:20:12 MSD 2008
Мо онро 30 майи соли 2008 гирифтем. "Ҷум" маънои рӯзи ҳафтаро дорад - "Ҷумъа" (ҷумъа) ва MSD - "Рӯзи тобистонаи Маскав" (бо вақти тобистони Маскав). Миллисонияҳо дар формат интиқол дода мешаванд long, зеро шумораи онҳо аксар вақт ба int. Пас, дар кори мо ба мо чӣ гуна амалиёти санавӣ лозим шуда метавонад? Хуб, чизи равшантарин, албатта, муқоиса аст . Муайян кунед, ки як сана дертар ё пештар аз дигар буд. Инро бо роҳҳои гуногун анҷом додан мумкин аст. Масалан, шумо метавонед усули .-ро даъват кунед Date.getTime(), ки шумораи миллисонияҳоеро, ки аз 1 январи соли 1970 аз нисфи шаб гузаштаанд, бармегардонад. Биёед онро танҳо дар ду an objectи Date даъват кунем ва онҳоро бо ҳамдигар муқоиса кунем:
public class Main {
   public static void main(String[] args) {

       Date date1 = new Date();

       Date date2 = new Date();

       System.out.println((date1.getTime() > date2.getTime())?
               "date1 is later than date2" : "date1 is earlier than date2");
   }
}
Хулоса:

date1 раньше date2
Аммо роҳи қулайтар вуҷуд дорад, яъне истифодаи усулҳои махсуси синф Date: before(), after()ва equals(). Ҳамаи онҳо натиҷаро дар boolean. Ин усул before()месанҷад, ки оё санаи мо аз санае, ки мо ҳамчун далел мегузарем, пештар аст:
public class Main {
   public static void main(String[] args) throws InterruptedException {

       Date date1 = new Date();

       Thread.sleep(2000);//pause the program for 2 seconds
       Date date2 = new Date();

       System.out.println(date1.before(date2));
   }
}
Натиҷаи консол:

true
Ин усул ба ҳамин тарз кор мекунад after(); он тафтиш мекунад, ки санаи мо дертар аз санае буд, ки мо ҳамчун далел мегузарем:
public class Main {
   public static void main(String[] args) throws InterruptedException {

       Date date1 = new Date();

       Thread.sleep(2000);//pause the program for 2 seconds
       Date date2 = new Date();

       System.out.println(date1.after(date2));
   }
}
Натиҷаи консол:

false
Дар мисолҳои мо, мо барномаро барои 2 сония ба хоб мегузорем, то ки ду сана кафолат дода шавад, ки гуногунанд. Дар компютерҳои тез, вақт байни эҷод date1ва date2метавонад камтар аз як миллисония бошад, дар ин ҳолат ҳам ва before()ва ҳам after()бармегарданд false. Аммо усул equals()дар чунин вазъият бармегардад true! Баъд аз ҳама, он маҳз шумораи миллисонияҳоеро, ки аз соати 00:00 1 январи соли 1970 барои ҳар як сана гузаштаанд, муқоиса мекунад. Объектҳо танҳо баробар ҳисобида мешаванд, агар онҳо то миллисония мувофиқат кунанд:
public static void main(String[] args) {

   Date date1 = new Date();
   Date date2 = new Date();

   System.out.println(date1.getTime());
   System.out.println(date2.getTime());

   System.out.println(date1.equals(date2));
}
Дар ин ҷо як чизи дигаре ҳаст, ки шумо бояд ба он диққат диҳед. Агар шумо ҳуҷҷатҳои синфро дар вебсайти Oracle кушоед , хоҳед дид, ки бисёре аз усулҳо ва конструкторҳои он ҳамчун (“кӯҳнашуда”) Dateтаъин шудаанд . DeprecatedИнак, бубинед: Таърихи синф Ин аст он чизе ки худи созандагони Java дар бораи он қисматҳои синфҳое, ки бекор карда шудаанд, мегӯянд: “Энменти барномае, ки бо @Deprecated шарҳ дода шудааст, он чизест, ки барномасозон аз истифодаи он рӯҳафтода мешаванд, одатан аз сабаби он хатарнок аст ё аз он сабаб. алтернативаи беҳтаре вуҷуд дорад." Ин маънои онро надорад, ки ин усулҳоро умуман истифода бурдан мумкин нест. Ғайр аз он, агар шумо худатон кӯшиш кунед, ки codeро бо истифода аз онҳо дар IDEA иҷро кунед, он эҳтимолан кор хоҳад кард.. Барои мисол усули бекоршударо гирем Date.getHours(), ки шумораи соатҳоро аз an object бармегардонад Date.
public static void main(String[] args) {

   Date date1 = new Date();

   System.out.println(date1.getHours());

}
Агар вақте ки шумо рамзро иҷро мекунед, масалан, соат 14:21 бошад, он рақами 14-ро намоиш медиҳад. Тавре ки шумо мебинед, усули бекоршуда хат кашида шудааст, аммо он хеле хуб кор мекунад. Ин усулҳо пурра нест карда нашудаанд, то ки як қатор codeҳои аллакай бо истифода аз онҳо навишташуда вайрон нашавад. Яъне, ин усулҳо "шикаста" ё "нест карда нашудаанд", онҳо танҳо барои истифода аз сабаби мавҷудияти алтернативаи мувофиқ тавсия дода намешаванд. Дар омади гап, дар ин бора дуруст дар ҳуҷҷатҳо навишта шудааст: Чӣ тавр дар вақт гум нашавед - DateTime ва Calendar - 2Аксари усулҳои синфи Date ба versionи такмилёфта ва васеъшудаи он - class кӯчонида шуданд Calendar. Мо бо ӯ бештар шинос мешавем :)

Тақвими Java

Java 1.1 синфи навро муаррифӣ кард - Calendar. Вай кор бо санаҳо дар Java нисбат ба пештара каме осонтар кард. Ягона татбиқи синфе Calendar, ки мо бо он кор хоҳем кард, синф аст GregorianCalendar(он тақвими григорианиро амалӣ мекунад, ки тибқи он аксари кишварҳои ҷаҳон зиндагӣ мекунанд). Бароҳатии асосии он дар он аст, ки он метавонад бо санаҳо дар формати мувофиқтар кор кунад. Масалан, ӯ метавонад:
  • Ба санаи ҷорӣ як моҳ ё рӯз илова кунед
  • Санҷед, ки оё сол соли кабиса аст;
  • Ҷузъҳои инфиродии санаро гиред (масалан, рақами моҳро аз тамоми сана гиред)
  • Ва инчунин, дар дохor он системаи хеле қулайи константҳо таҳия шудааст (мо бисёре аз онҳоро дар зер мебинем).
Фарқи дигари муҳими синф Calendarдар он аст, ки он константаро амалӣ мекунад Calendar.Era: шумо метавонед санаро ба давраи то милод (Пеш аз Масеҳ - пеш аз таваллуди Масеҳ, яъне "пеш аз эраи мо") ё AC (Баъд аз Масеҳ" - " таъин кунед. даврони мо"). Хамаи инро бо мисолхо дида мебароем. Биёед тақвимро бо санаи 25 январи соли 2017 эҷод кунем:
public static void main(String[] args) {

  Calendar calendar = new GregorianCalendar(2017, 0 , 25);
}
Моҳҳо дар синф Calendar(чун дар Date, дар омади гап) аз сифр оғоз мешаванд, аз ин рӯ мо рақами 0-ро ҳамчун далели дуюм гузаштем. Чизи асосӣ ҳангоми кор бо синф Calendarфаҳмидани он аст, ки ин тақвим аст , на санаи алоҳида. Чӣ тавр дар вақт гум нашавед - DateTime ва Calendar - 3Санаи танҳо як қатор рақамҳоест, ки давраи муайяни вақтро ифода мекунанд. Ва тақвим як дастгоҳи томест, ки бо он шумо метавонед бо санаҳо бисёр корҳоро анҷом диҳед :) Инро хеле равшан дидан мумкин аст, агар шумо кӯшиш кунед, ки an objectи Calendar-ро ба консол бароварданӣ шавед: Натиҷа:

java.util.GregorianCalendar[time=?,areFieldsSet=false,areAllFieldsSet=false,lenient=true,zone=sun.util.calendar.ZoneInfo[id="Europe/Moscow",offset=10800000,dstSavings=0,useDaylight=false,transitions=79,lastRule=null],firstDayOfWeek=2,minimalDaysInFirstWeek=1,ERA=?,YEAR=2017,MONTH=0,WEEK_OF_YEAR=?,WEEK_OF_MONTH=?,DAY_OF_MONTH=25,DAY_OF_YEAR=?,DAY_OF_WEEK=?,DAY_OF_WEEK_IN_MONTH=?,AM_PM=0,HOUR=0,HOUR_OF_DAY=0,MINUTE=0,SECOND=0,MILLISECOND=?,ZONE_OFFSET=?,DST_OFFSET=?]
Бубинед, ки чӣ қадар маълумот вуҷуд дорад! Тақвим дорои як қатор хосиятҳое мебошад, ки санаи муқаррарӣ надорад ва ҳамаи онҳо ба консол бароварда мешаванд (усул toString()дар синф ҳамин тавр кор мекунад Calendar). Агар, ҳангоми кор, шумо танҳо лозим аст, ки санаи оддӣ аз тақвим гиред, яъне. an object Date- ин бо истифода аз усул анҷом дода мешавад Calendar.getTime()(ном мантиқтарин нест, аммо ҳеҷ кор карда намешавад):
public static void main(String[] args) {

   Calendar calendar = new GregorianCalendar(2017, 0 , 25);
   Date date = calendar.getTime();
   System.out.println(date);
}
Хулоса:

Wed Jan 25 00:00:00 MSK 2017
Акнун мо тақвимро ба санаи муқаррарӣ «содда» кардем. Биёед пеш равем. Илова ба аломатҳои ададӣ барои моҳҳо, Calendarконстантаҳоро дар синф истифода бурдан мумкин аст. Константҳо майдонҳои статикии синф Calendarбо арзиши аллакай муқарраршуда мебошанд, ки тағир дода намешаванд. Ин вариант воқеан беҳтар аст, зеро он хониши codeро беҳтар мекунад.
public static void main(String[] args) {
   GregorianCalendar calendar = new GregorianCalendar(2017, Calendar.JANUARY , 25);
}
Calendar.JANUARY— яке аз константахо барои нишон додани мох. Бо ин варианти номгузорӣ, ҳеҷ кас фаромӯш намекунад, масалан, рақами "3" маънои апрелро дорад, на моҳи сеюми мо - март. Шумо танҳо нависед Calendar.APRIL- ва ҳамин тавр аст :) Ҳама майдонҳои тақвимӣ (рӯз, моҳ, дақиқаҳо, сонияҳо ва ғ.) метавонанд бо истифода аз усули set(). Ин хеле қулай аст, зеро Calendarҳар як майдон дар синф доимии худро дорад ва рамзи ниҳоӣ то ҳадди имкон содда хоҳад буд. Масалан, дар мисоли қаблӣ мо сана эҷод кардем, аммо вақти ҷорӣро барои он муқаррар накардаем. Биёед вақтро ба 19:42:12 муқаррар кунем
public static void main(String[] args) {
   Calendar calendar = new GregorianCalendar();
   calendar.set(Calendar.YEAR, 2017);
   calendar.set(Calendar.MONTH, 0);
   calendar.set(Calendar.DAY_OF_MONTH, 25);
   calendar.set(Calendar.HOUR_OF_DAY, 19);
   calendar.set(Calendar.MINUTE, 42);
   calendar.set(Calendar.SECOND, 12);

   System.out.println(calendar.getTime());
}
Хулоса:

Wed Jan 25 19:42:12 MSK 2017
Мо методро меномем set(), ба он константа (вобаста ба майдоне, ки мо тағир додан мехоҳем) ва арзиши навро барои ин майдон мегузорем. Маълум мешавад, ки усул set()як навъ "супер-танзимкунанда" аст, ки метавонад на барои як майдон, балки барои бисёр майдонҳо арзиш муқаррар кунад :) Илова ва тарҳ кардани арзишҳо дар синф Calendarбо истифода аз add(). Шумо бояд ба он майдонеро, ки шумо тағир додан мехоҳед, ворид кунед ва рақам - маҳз чӣ қадар мехоҳед аз арзиши ҷорӣ илова/тарҳ кунед. Масалан, биёед санаи 2 моҳ пеш офаридаамонро муқаррар кунем:
public static void main(String[] args) {
   Calendar calendar = new GregorianCalendar(2017, Calendar.JANUARY , 25);
   calendar.set(Calendar.HOUR, 19);
   calendar.set(Calendar.MINUTE, 42);
   calendar.set(Calendar.SECOND, 12);

   calendar.add(Calendar.MONTH, -2);//to subtract a value - a negative number must be passed to the method
   System.out.println(calendar.getTime());
}
Хулоса:

Fri Nov 25 19:42:12 MSK 2016
Аҷоиб! Мо санаро ба 2 моҳ пеш муқаррар кардем. Дар натиҷа, на танҳо моҳ, балки сол ҳам иваз шуд, аз соли 2017 то 2016. Ҳисобкунии соли ҷорӣ ҳангоми интиқоли санаҳо, албатта, ба таври худкор анҷом дода мешавад ва ба таври дастӣ назорат кардан лозим нест. Аммо агар барои ягон мақсад ба шумо лозим ояд, ки ин рафторро хомӯш кунед, шумо метавонед ин корро кунед. Усули махсус roll()метавонад арзишҳоро бидуни таъсир ба арзишҳои дигар илова ва кам кунад. Масалан, ба ин монанд:
public static void main(String[] args) {
   Calendar calendar = new GregorianCalendar(2017, Calendar.JANUARY , 25);
   calendar.set(Calendar.HOUR, 10);
   calendar.set(Calendar.MINUTE, 42);
   calendar.set(Calendar.SECOND, 12);

   calendar.roll(Calendar.MONTH, -2);
   System.out.println(calendar.getTime());
}
Мо айнан ҳамон тавре ки дар мисоли қаблӣ кор кардем - мо аз санаи ҷорӣ 2 моҳро тарҳ кардем. Аммо ҳоло рамз ба таври дигар кор мекард: моҳ аз январ то ноябр иваз шуд, аммо сол мисли соли 2017 боқӣ монд! Хулоса:

Sat Nov 25 10:42:12 MSK 2017
Минбаъд. Тавре ки мо дар боло гуфтем, ҳамаи майдонҳои an objectро Calendarалоҳида гирифтан мумкин аст. Усул барои ин масъул аст get():
public static void main(String[] args) {
   GregorianCalendar calendar = new GregorianCalendar(2017, Calendar.JANUARY , 25);
   calendar.set(Calendar.HOUR, 10);
   calendar.set(Calendar.MINUTE, 42);
   calendar.set(Calendar.SECOND, 12);

   System.out.println("Year: " + calendar.get(Calendar.YEAR));
   System.out.println("Month: " + calendar.get(Calendar.MONTH));
   System.out.println("Number of the week in the month: " + calendar.get(Calendar.WEEK_OF_MONTH));// serial number of the week in the month

   System.out.println("Number: " + calendar.get(Calendar.DAY_OF_MONTH));

   System.out.println("Watch: " + calendar.get(Calendar.HOUR));
   System.out.println("Minutes: " + calendar.get(Calendar.MINUTE));
   System.out.println("Seconds: " + calendar.get(Calendar.SECOND));
   System.out.println("Milliseconds: " + calendar.get(Calendar.MILLISECOND));

}
Хулоса:

Год: 2017 
Месяц: 0 
Порядковый номер недели в месяце: 4 
Число: 25 
Часы: 10 
Минуты: 42 
Секунды: 12 
Миллисекунды: 0
Яъне, дар синф ба ѓайр аз «супер-стер» Calendarяк «супер-гетер» низ вуљуд дорад :) Дигар нуктаи љолиб, албатта, кор бо эрањост. Барои сохтани санаи "BC" шумо бояд майдонро истифода баред Calendar.Era . Ин 2 августи соли 216 пеш аз милод рӯй дод. д.:
public static void main(String[] args) {
   GregorianCalendar cannes = new GregorianCalendar(216, Calendar.AUGUST, 2);
   cannes.set(Calendar.ERA, GregorianCalendar.BC);

   DateFormat df = new SimpleDateFormat("dd MMM yyy GG");
   System.out.println(df.format(cannes.getTime()));
}
Дар ин ҷо мо синфро SimpleDateFormatбарои нишон додани сана дар формате истифода кардем, ки барои мо фаҳмотар бошад (ҳарфҳои "GG" барои намоиши давр масъуланд). Хулоса:

02 авг 216 до н.э.
Дар синф Calendarусулҳо ва константаҳои бештар мавҷуданд , дар бораи онҳо дар ҳуҷҷатҳо хонед:

Табдил додани сатр ба сана

Барои табдил додани сатр ба сана, шумо метавонед синфи ёрирасони Java - SimpleDateFormat -ро истифода баред . Ин синфест, ки шумо бояд санаро ба формати муайянкардаатон табдил диҳед. Дар навбати худ, он ба DateFormatЧӣ тавр дар вақт гум нашавед - DateTime ва Calendar - 5 хеле монанд аст . Ягона фарқияти назаррас байни ин ду дар он аст, ки SimpleDateFormat метавонад барои форматкунӣ (табдил додани сана ба сатр) ва таҳлor сатр ба санаи аз маҳалли маҳаллӣ истифода шавад, дар ҳоле ки DateFormat маҳаллиро дастгирӣ намекунад. Илова бар ин, DateFormat синфи абстрактист, ки дастгирии асосиро барои форматкунӣ ва таҳлor санаҳо таъмин мекунад, дар ҳоле ки SimpleDateFormat синфи мушаххасест, ки синфи DateFormat-ро васеъ мекунад. Намунаи сохтани an objectи SimpleDateFormat ва форматкунии Сана чунин аст:
SimpleDateFormat formater = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
Date date = new Date(1212121212121L);

System.out.println(formatter.format(date));
Дар мисоли боло мо намунаи "yyyy-MM-dd HH:mm:ss"-ро истифода бурдем, ки маънои:
  • 4 рақам барои сол (yyyy);
  • 2 рақам барои моҳ (ММ);
  • 2 рақам барои рӯз (dd);
  • 2 рақам барои соатҳо дар формати 24 соат (HH);
  • 2 рақам барои дақиқаҳо (мм);
  • 2 рақам барои сонияҳо (ss).
Аломатҳои ҷудокунӣ ва тартиби рамзҳои намунавӣ нигоҳ дошта мешаванд. Натиҷаи консол:
2008-05-30 08:20:12
Барои синфи SimpleDateFormat ҳарфҳои шаблон хеле зиёданд . Барои он ки шумо ошуфта нашавед, мо онҳоро дар ҷадвал ҷамъ овардаем:
Рамз Тавсифи Мисол
Г эра (бо локализатсияи англисӣ - милод ва милод) AD
й сол (рақами 4-рақама) 2020
yy сол (2 рақами охир) 20
ееее сол (рақами 4-рақама) 2020
М рақами моҳ (бе сифрҳои пешбаранда) 8
ММ рақами моҳ (бо сифрҳои пешбаранда, агар рақами моҳ <10 бошад) 04
МММ мухтасари моҳаи се ҳарфӣ (мувофиқи маҳаллисозӣ) январ
ММММ номи пурраи моҳ июн
в ҳафтаи сол (бе сифрҳои пешбаранда) 4
ww ҳафтаи сол (бо сифрҳои пешбаранда) 04
В ҳафта дар моҳ (бе сифрҳои пешбаранда) 3
WW ҳафта дар моҳ (бо сифр пешбаранда) 03
Д рӯзи сол 67
г рӯзи моҳ (бе сифрҳои пешбаранда) 9
дд рӯзи моҳ (бо сифрҳои пешбаранда) 09
Ф рӯзи ҳафта дар моҳ (бе сифрҳои пешбаранда) 9
FF рӯзи ҳафта дар моҳ (бо сифрҳои пешбаранда) 09
Э рӯзи ҳафта (ихтисор) В
EEEE рӯзи ҳафта (пурра) Ҷумъа
у рақами рӯзи ҳафта (бе сифрҳои пешбаранда) 5
uu рақами рӯзи ҳафта (бо сифрҳои пешбаранда) 05
а Нишондиҳандаи AM/PM А.М.
Х соат дар формати 24 соат бе сифрҳои пешбаранда 6
HH соат дар формати 24 соат бо сифр пешбаранда 06
к шумораи соатҳо дар формати 24 соат 18
К шумораи соатҳо дар формати 12 соат 6
ч вақт дар формати 12 соат бе сифрҳои пешбаранда 6
щ вақт дар формати 12 соат бо сифр пешбаранда 06
м дақиқа бе сифрҳои пешбаранда 32
мм дақиқа бо пешбари сифр 32
с сония бе сифрҳои пешбаранда ёздаҳ
сс сония бо пешбари сифр ёздаҳ
С миллисонияҳо 297
з Минтақаи вақт Вақти Аврупои Шарқӣ
З Минтақаи вақт дар формати RFC 822 300
Намунаҳои таркиби аломатҳои намунавӣ:
Намуна Мисол
gg-MM-yyyy 01-11-2020
yy-MM-dd 10-01-2019
СС:мм:сс.SSS 23:59.59.999
yyyy-MM-gg HH:mm:ss 2018-11-30 03:09:02
yyyy-MM-gg HH:mm:ss.SSS 2016-03-01 01:20:47.999
yyyy-MM-gg HH:mm:ss.SSS Z 2013-13-13 23:59:59.999 +0100
Агар шумо бо формат каме хато кунед, шумо метавонед соҳиби java.text.ParseException шавед ва ин дастоварди махсусан гуворо нест. Хуб, экскурсияи кӯтоҳ ба SimpleDateFormat ба охир расид - биёед ба тарҷумаи сатри java то имрӯз баргардем . SimpleDateFormat ба мо чунин қобorятҳоро медиҳад ва мо ин равандро зина ба зина тай мекунем.
  1. Хатеро созед, ки аз он шумо бояд санаро таъин кунед:

    String strDate = "Sat, April 4, 2020";
  2. Мо an objectи нави SimpleDateFormat -ро бо қолабе эҷод мекунем, ки ба он чизе, ки дар сатр дорем, мувофиқат мекунад (дар акси ҳол мо онро таҳлил карда наметавонем):

    SimpleDateFormat formatter = new SimpleDateFormat("EEE, MMMM d, yyyy", Locale.ENGLISH);

    Тавре ки шумо мебинед, мо дар ин ҷо як далели маҳаллӣ дорем. Агар мо онро сарфи назар кунем, он забони пешфарзро истифода хоҳад кард, ки на ҳамеша англисӣ аст.

    Агар маҳалли ҷойгиршавӣ ба сатри вуруд мувофиқат накунад, он гоҳ маълумотҳои сатри ба забон пайвастшуда, ба монанди забони мо Mon ё April эътироф намешаванд ва java.text.ParseExceptionро мепартоянд, ҳатто агар намуна мувофиқат кунад.

    Аммо, ба мо лозим нест, ки форматро муайян кунем, агар мо қолаберо истифода барем, ки ба забон хос нест. Мисол - yyyy-MM-dd HH:mm:ss

  3. Мо бо истифода аз форматкунанда сана эҷод мекунем, ки он дар навбати худ онро аз сатри воридот таҳлил мекунад:

    try {
      Date date = formatter.parse(strDate);
      System.out.println(date);
    }
    catch (ParseException e) {
      e.printStackTrace();
    }

    Натиҷаи консол:

    
    Sat Apr 04 00:00:00 EEST 2020

    Хмм... Аммо формат дигар як хел нест!

    Барои сохтани ҳамон формат, мо боз форматкуниро истифода мебарем:

    System.out.println(formatter.format(date));

    Натиҷаи консол:

    
    Sat, April 4, 2020

SimpleDateFormat ва Calendar

SimpleDateFormat ба шумо имкон медиҳад, ки ҳама an objectҳои Сана ва Тақвимро, ки шумо барои истифодаи минбаъда эҷод мекунед, формат кунед. Биёед як нуктаи ҷолибро, монанди кор бо эраҳо баррасӣ кунем. Барои эҷод кардани санаи "BC", шумо бояд майдони Calendar.Era -ро истифода баред. Масалан, биёед санаеро эҷод кунем, ки Ҷанги Каннаро нишон медиҳад, ки дар он Ганнибал артиши Румро мағлуб кардааст. Ин 2 августи соли 216 пеш аз милод рӯй дод. д.:
public static void main(String[] args) {
   GregorianCalendar cannes = new GregorianCalendar(216, Calendar.AUGUST, 2);
   cannes.set(Calendar.ERA, GregorianCalendar.BC);

   DateFormat df = new SimpleDateFormat("dd MMM yyy GG");
   System.out.println(df.format(cannes.getTime()));
}
Дар ин ҷо мо синфи SimpleDateFormat-ро истифода бурдем, то санаро дар формате, ки барои мо фаҳмотар бошад, нишон диҳад (тавре ки дар боло нишон дода шуд, ҳарфҳои "GG" барои намоиши давр масъуланд). Хулоса:

02 авг 216 до н.э.

Формат санаи Java

Ана боз як парвандаи дигар. Фарз мекунем, ки ин формати сана ба мо мувофиқат намекунад:

Sat Nov 25 10:42:12 MSK 2017
Пас, ин ҷост. Бо истифода аз қобorятҳои мо дар формати санаи java, шумо метавонед онро бидуни мушкor худ ба худ иваз кунед:
public static void main(String[] args) {

   SimpleDateFormat dateFormat = new SimpleDateFormat("EEEE, d MMMM yyyy");
   Calendar calendar = new GregorianCalendar(2017, Calendar.JANUARY , 25);
   calendar.set(Calendar.HOUR, 10);
   calendar.set(Calendar.MINUTE, 42);
   calendar.set(Calendar.SECOND, 12);

   calendar.roll(Calendar.MONTH, -2);
   System.out.println(dateFormat.format(calendar.getTime()));
}
Хулоса:

суббота, 25 Ноябрь 2017
Хеле беҳтар, дуруст? :)
Шарҳҳо
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION