জাভা: কেন তারিখ নির্মাতা অবনতি হয় এবং এর পরিবর্তে আমি কী ব্যবহার করব?


211

আমি সি # ওয়ার্ল্ড থেকে এসেছি, তাই জাভা নিয়ে এখনও খুব বেশি অভিজ্ঞ নই। আমি স্রেফ গ্রহণের কথা জানিয়েছিলাম যা অবহেলা করা Dateহয়েছিল:

Person p = new Person();
p.setDateOfBirth(new Date(1985, 1, 1));

কেন? এবং এর পরিবর্তে কী (বিশেষত উপরের মতো ক্ষেত্রে) ব্যবহার করা উচিত?


37
আমি সি থেকে জাভাতেও একই ধরণের শেখার বক্ররেখা অনুভব করছি। আমার বিটটি অন্য যেটি হ'ল বছরের মাসটি 0-ভিত্তিক সিস্টেম (0 থেকে 11 যেখানে জানুয়ারি = 0 এবং ডিসেম্বর। = 11) তবে মাসের দিনগুলি 1-ভিত্তিক (1 থেকে 31) হয়। মাথা উঁচু করে!
পল স্যাসিক

2
@ পল সাসিক, হ্যাঁ, তবে ক্যালেন্ডার রয়েছে example উদাহরণস্বরূপ
ডায়োগো

5
নিবন্ধন করুন হ্যাঁ, বোকা জাভা। সি # থেকে জাভা এবং ওএমজি থেকে ব্যথা এবং বেদনাতে যেতে হয়েছিল।
সিবিএমিক্স


8
সি # লোকের কাছ থেকে জাভা সম্পর্কে চিত্তাকর্ষক "লোল" মন্তব্যগুলি আমাকে হাসিয়েছিল কারণ নেট জাভা লাইব্রেরি জোদা-টাইমের একটি বন্দর থেকে তার সুন্দর তারিখ -কালীন গ্রন্থাগার ( নোদা টাইম ) পেয়েছে ।
বাসিল বাউরক

উত্তর:


97

নির্দিষ্ট Dateকনস্ট্রাক্টর অবনতিহীন এবং Calendarপরিবর্তে ব্যবহার করা উচিত। JavaDocজন্য তারিখ বর্ণনা যা কনস্ট্রাকটর অননুমোদিত হয় এবং একটি ব্যবহার করে সেগুলি প্রতিস্থাপন করতে কিভাবে Calendar


25
ক্যালেন্ডারে একটি অতিরিক্ত অবজেক্টের প্রয়োজন হয় এবং একই জিনিস করতে আরও 8 টি লাইনের মতো কোড থাকে যা আমি যা বলতে পারি তার থেকে তারিখ অবজেক্ট তৈরি করা হয়। এটি বিভ্রান্তিকর এবং অপ্রয়োজনীয় বলে মনে হয় যখন আপনার কেবল একটি সময় প্রয়োজন এবং সময় অঞ্চল অ্যাডজাস্টেড ভেরিয়েবলের প্রয়োজন হয় না।
G_V

5
অবগতির জন্য, যেমন ভয়ঙ্কর বিরক্তিজনক পুরাতন তারিখ-সময় শ্রেণীর java.util.Date, java.util.Calendarএবং java.text.SimpleDateFormatএখন উত্তরাধিকার দ্বারা supplanted java.time জাভা 8 এবং পরে পাতাটা ক্লাস। ওরাকল দ্বারা টিউটোরিয়াল দেখুন ।
তুলসী বাউরকে

250

java.util.Dateবর্গ আসলে অবচিত না, শুধুমাত্র সেই কন্সট্রাকটর, একটি দম্পতি অন্যান্য কনস্ট্রাকটর / পদ্ধতি অবচিত হয় বরাবর। এটিকে অবমুক্ত করা হয়েছে কারণ এই জাতীয় ব্যবহার আন্তর্জাতিকীকরণের সাথে ভালভাবে কাজ করে না। Calendarবর্গ পরিবর্তে ব্যবহার করা উচিত:

Calendar cal = Calendar.getInstance();
cal.set(Calendar.YEAR, 1988);
cal.set(Calendar.MONTH, Calendar.JANUARY);
cal.set(Calendar.DAY_OF_MONTH, 1);
Date dateRepresentation = cal.getTime();

জাভাদোক তারিখটি একবার দেখুন:

http://download.oracle.com/javase/6/docs/api/java/util/Date.html


2
এটি সেরা উত্তর হওয়া উচিত। ধন্যবাদ।
jordaniac89

"আন্তর্জাতিকীকরণের সাথে ভাল কাজ করে না" এই কথাটি বলতে কি আপনার অর্থ কি এই যে তারিখের জন্য আপনি এর জন্য সময় অঞ্চল নির্ধারণ করতে পারবেন না? ধন্যবাদ
ডিভইন্টো

কোন তারিখটি একটি স্ট্রিংকে পার্স করা হয়েছিল, সুতরাং এর পরিবর্তে এখন আমাদের একটি স্ট্রিংকে স্ট্রিং করতে হবে যাতে বছর, মাস এবং দিন রয়েছে? এমন কোনও কিছুর জন্য অতিরিক্ত অতিরিক্ত ঝামেলার মতো মনে হয় যা বেশিরভাগ ক্ষেত্রে এর সাথে এ জাতীয় জটিল যুক্তি এবং পদ্ধতির প্রয়োজন হয় না।
জি_ভি

1
কেবল যোগ করতে, এটি ডিফল্ট সময় অঞ্চল বিবেচনায় নেবে। আমরা যদি অন্য কোনও টাইমজোন নির্দিষ্ট করতে চাই তবে আমরা ব্যবহার করতে পারিCalendar cal = Calendar.getInstance(TimeZone.getTimeZone(<timezone id>));
বিকাশ প্রসাদ

1
"পরিবর্তে ক্যালেন্ডার শ্রেণিটি ব্যবহার করা উচিত" - জাভা 8 এবং তার পরে java.time.*ক্লাসগুলি আরও ভাল বিকল্প ... যদি আপনি নিজের কোড পরিবর্তন করে থাকেন।
স্টিফেন সি

73

TL; ড

LocalDate.of( 1985 , 1 , 1 )

... অথবা ...

LocalDate.of( 1985 , Month.JANUARY , 1 )

বিস্তারিত

java.util.Date, java.util.Calendar, এবং java.text.SimpleDateFormatক্লাস খুব দ্রুত ছুটে যখন জাভা প্রথম চালু হয় এবং প্রসূত হয়েছে। ক্লাসগুলি ভালভাবে ডিজাইন বা প্রয়োগ করা হয়নি। উন্নতির চেষ্টা করা হয়েছিল, এভাবে আপনি খুঁজে পেয়েছেন হ্রাস। দুর্ভাগ্যক্রমে উন্নতির প্রচেষ্টা ব্যর্থ হয়েছে। আপনার এই ক্লাসগুলি পুরোপুরি এড়ানো উচিত । এগুলি নতুন ক্লাস দ্বারা জাভা 8 এ সরবরাহ করা হয়েছে।

আপনার কোডে সমস্যা

একটি java.util.Date একটি তারিখ এবং একটি সময় অংশ উভয় আছে। আপনি আপনার কোডের সময়ের অংশটিকে উপেক্ষা করেছেন। সুতরাং তারিখ শ্রেণিটি আপনার জেভিএমের ডিফল্ট সময় অঞ্চল দ্বারা নির্ধারিত দিনের শুরুতে সময় গ্রহণ করবে এবং তারিখের অবজেক্টে সেই সময়টিকে প্রয়োগ করবে। সুতরাং আপনার কোডের ফলাফলগুলি কোন মেশিনটি চালায় বা কোন সময় অঞ্চল সেট করা আছে তার উপর নির্ভরশীল will সম্ভবত আপনি যা চান তা নয়।

আপনি যদি জন্মের তারিখের মতো সময়ের অংশ ব্যতীত ঠিক তারিখটি চান তবে আপনি কোনও Dateঅবজেক্টটি ব্যবহার করতে নাও চান । আপনি তারিখের কেবল একটি স্ট্রিং আইএসও 8601 ফর্ম্যাটে সংরক্ষণ করতে পারেন YYYY-MM-DD। অথবা LocalDateজোদা-সময় থেকে কোনও বস্তু ব্যবহার করুন (নীচে দেখুন)।

Joda-টাইম

জাভাতে প্রথমে শিখতে হবে: জাভা ইউটিਲ.ডেট এবং জাভা.ইটিল.ক্যাল্যাভার ক্লাস জাভা দিয়ে বান্ডিল করা এড়িয়ে চলুন

ব্যবহারকারী 3277382 এর উত্তরে সঠিকভাবে উল্লিখিত হিসাবে , জাডা -টাইম বা জাভা টাইমে নতুন জাভা.টাইম। * প্যাকেজটি ব্যবহার করুন

জোদা-সময় উদাহরণ কোড 2.3

DateTimeZone timeZoneNorway = DateTimeZone.forID( "Europe/Oslo" );
DateTime birthDateTime_InNorway = new DateTime( 1985, 1, 1, 3, 2, 1, timeZoneNorway );

DateTimeZone timeZoneNewYork = DateTimeZone.forID( "America/New_York" );
DateTime birthDateTime_InNewYork = birthDateTime_InNorway.toDateTime( timeZoneNewYork ); 

DateTime birthDateTime_UtcGmt = birthDateTime_InNorway.toDateTime( DateTimeZone.UTC );

LocalDate birthDate = new LocalDate( 1985, 1, 1 );

কনসোল করতে ডাম্প ...

System.out.println( "birthDateTime_InNorway: " + birthDateTime_InNorway );
System.out.println( "birthDateTime_InNewYork: " + birthDateTime_InNewYork );
System.out.println( "birthDateTime_UtcGmt: " + birthDateTime_UtcGmt );
System.out.println( "birthDate: " + birthDate );

যখন চালানো…

birthDateTime_InNorway: 1985-01-01T03:02:01.000+01:00
birthDateTime_InNewYork: 1984-12-31T21:02:01.000-05:00
birthDateTime_UtcGmt: 1985-01-01T02:02:01.000Z
birthDate: 1985-01-01

java.time

এই ক্ষেত্রে জাভা.টাইমের কোড কোডটি জোদা-টাইমের সাথে প্রায় একই রকম ।

আমরা একটি সময় অঞ্চল ( ZoneId) পাই এবং সেই সময় অঞ্চলে ( ZonedDateTime) নির্ধারিত একটি তারিখ-সময় অবজেক্টটি তৈরি করি । তারপরে অপরিবর্তনীয় অবজেক্টস প্যাটার্নটি ব্যবহার করে , আমরা পুরানো অবজেক্টের একই তাত্ক্ষণিকতার (নতুন যুগের পরে ন্যানোসেকেন্ডের গণনা ) উপর ভিত্তি করে নতুন তারিখ-সময় তৈরি করি তবে অন্য সময় অঞ্চল নির্ধারিত। শেষ অবধি আমরা এমন একটি LocalDateসময় পাই যা দিনের কোন সময় বা সময় অঞ্চল নেই যদিও লক্ষ্য নির্ধারণের সময় সময় অঞ্চলটি প্রযোজ্য তা লক্ষ্য করুন ( উদাহরণস্বরূপ নিউ ইয়র্কের চেয়ে ওসলোতে একটি নতুন দিন শুরুর আগে )।

ZoneId zoneId_Norway = ZoneId.of( "Europe/Oslo" );
ZonedDateTime zdt_Norway = ZonedDateTime.of( 1985 , 1 , 1 , 3 , 2 , 1 , 0 , zoneId_Norway );

ZoneId zoneId_NewYork = ZonedId.of( "America/New_York" );
ZonedDateTime zdt_NewYork = zdt_Norway.withZoneSameInstant( zoneId_NewYork );

ZonedDateTime zdt_Utc = zdt_Norway.withZoneSameInstant( ZoneOffset.UTC );  // Or, next line is similar.
Instant instant = zdt_Norway.toInstant();  // Instant is always in UTC.

LocalDate localDate_Norway = zdt_Norway.toLocalDate();

জাভা.টাইম সম্পর্কে

Java.time ফ্রেমওয়ার্ক জাভা 8 এবং পরে পাতাটা করা হয়। এই ক্লাসগুলি , & , এর মতো সমস্যাযুক্ত পুরানো উত্তরাধিকারের তারিখ-সময়ের ক্লাসগুলিকে সহায়তা করে ।java.util.DateCalendarSimpleDateFormat

Joda-টাইম প্রকল্প, এখন রক্ষণাবেক্ষণ মোড , মাইগ্রেশনে উপদেশ java.time ক্লাস।

আরও জানতে, ওরাকল টিউটোরিয়াল দেখুন । এবং অনেক উদাহরণ এবং ব্যাখ্যার জন্য স্ট্যাক ওভারফ্লো অনুসন্ধান করুন। স্পেসিফিকেশনটি জেএসআর 310

আপনি আপনার ডাটাবেসের সাথে জাভা.টাইম অবজেক্টগুলি সরাসরি বিনিময় করতে পারেন । জেডিবিসি ৪.২ বা তারপরের সাথে অনুগত একটি জেডিবিসি ড্রাইভার ব্যবহার করুন । স্ট্রিংগুলির দরকার নেই, ক্লাসের প্রয়োজন নেই ।java.sql.*

জাভা.টাইম ক্লাস কোথায় পাবেন?

ThreeTen-অতিরিক্ত প্রকল্প অতিরিক্ত শ্রেণীর সাথে java.time প্রসারিত করে। এই প্রকল্পটি জাভা.টাইমে সম্ভাব্য ভবিষ্যতের সংযোজনগুলির একটি প্রমাণযোগ্য ক্ষেত্র। আপনি এখানে কিছু দরকারী শ্রেণীর যেমন খুঁজে পেতে পারেন Interval, YearWeek, YearQuarter, এবং আরো


5
মূল কারণ উল্লেখ এবং সমস্ত উপলব্ধ বিকল্পের কভারেজ প্রদানের জন্য প্রপস।
মাবি

এটি সঠিক উত্তর এবং ক্যালেন্ডার শ্রেণি এড়ানো উচিত। থ্রিটেন সেরা বিকল্প
ant2009

11

কনস্ট্রাক্টর অবমূল্যায়নের একটি কারণ হ'ল বছরের প্যারামিটারটির অর্থ আপনার প্রত্যাশাটি নয়। জাভাদোক বলেছেন:

JDK সংস্করণ 1.1 হিসাবে, দ্বারা প্রতিস্থাপিত Calendar.set(year + 1900, month, date)

লক্ষ্য করুন যে বছরের ক্ষেত্রটি বছরের পরের সংখ্যা 1900, সুতরাং আপনার স্যাম্পল কোডটি সম্ভবত আপনি যা প্রত্যাশা করছেন তা তা করবে না। এবং যে বিষয়টি।

সাধারণভাবে, Dateএপিআই কেবলমাত্র আধুনিক পশ্চিমা ক্যালেন্ডারকে সমর্থন করে, আইডিসিঙ্ক্র্যাটিকভাবে নির্দিষ্ট উপাদান রয়েছে এবং আপনি ক্ষেত্রগুলি সেট করে দিলে অসম্পূর্ণ আচরণ করে।

Calendarএবং GregorianCalendarAPI গুলি চেয়ে ভাল Date, এবং 3 য় পক্ষের Joda সময় API গুলি সাধারণত সেরা বলে মনে করা হয়। জাভা 8-এ, তারা java.timeপ্যাকেজগুলি চালু করেছিল এবং এগুলি এখন প্রস্তাবিত বিকল্প।


এই সমাধানটি দুর্দান্ত কাজ করে, এ ছাড়া এটি নতুন তারিখ (বছর, মাস, দিন) এর মতো ঘন্টা-মিনিট-সেকেন্ড-মিলিসেকেন্ডের জন্য শূন্য-সময় ব্যবহার করে না। সুতরাং আমাদের মতো কিছু দরকার: ক্যালেন্ডার ক্যাল = ক্যালেন্ডার। cal.clear (); cal.set (বছর + 1900, মাস, তারিখ); তারিখের তারিখপ্রকাশ = Cal.getTime ();
জোয়েল রিচার্ড কোয়েট

11

আমি এই প্রশ্নটি একটি নতুন প্রশ্নের সদৃশ হিসাবে এসেছি যা Dateএকটি নির্দিষ্ট বছর, মাস, এবং দিনটিতে অবহিত হওয়ার উপায় কী তা জানতে চেয়েছিল ।

এখানে এতক্ষণের উত্তরগুলি Calendarক্লাসটি ব্যবহার করতে বলে এবং জাভা 8 আসার আগ পর্যন্ত এটি সত্য ছিল। তবে জাভা 8 হিসাবে, এটি করার মানক উপায়টি হ'ল:

LocalDate localDate = LocalDate.of(1985, 1, 1);

এবং তারপরে যদি আপনার সত্যই দরকার হয় তবে আপনি এই প্রশ্নেরjava.util.Date পরামর্শগুলি ব্যবহার করতে পারেন ।

আরও তথ্যের জন্য, জাভা 8 এর জন্য এপিআই বা টিউটোরিয়ালগুলি দেখুন


7

দয়া করে মনে রাখবেন Calendar.getTime()অর্থে nondeterministic যে দিনের বর্তমান সময়ের মধ্যে অংশ অক্ষমতা।

পুনরুত্পাদন করতে, কয়েকবার নিম্নলিখিত কোড চালানোর চেষ্টা করুন:

Calendar c = Calendar.getInstance();
c.set(2010, 2, 7); // NB: 2 means March, not February!
System.err.println(c.getTime());

আউটপুট যেমন:

Sun Mar 07 10:46:21 CET 2010

কয়েক মিনিট পরে ঠিক একই কোডটি চালানো ফলন দেয়:

Sun Mar 07 10:57:51 CET 2010

সুতরাং, set()মানগুলি সংশোধন করার জন্য সংশ্লিষ্ট ক্ষেত্রগুলিকে বাধ্য করার সময়, অন্যান্য ক্ষেত্রগুলির জন্য এটি সিস্টেমের সময় ফাঁস করে। (উপরের দিকে সান jdk6 এবং jdk7 দিয়ে পরীক্ষিত)



5

বেশিরভাগ জাভা বিকাশকারীরা বর্তমানে তৃতীয় পক্ষের প্যাকেজ জোদা-টাইম ব্যবহার করে । এটি ব্যাপকভাবে একটি আরও কার্যকর বাস্তবায়ন হিসাবে বিবেচিত হয়।

জাভা 8 তে তবে নতুন জাভা.টাইম হবে * * প্যাকেজজেডিকে 8 এর জন্য নতুন তারিখ এবং সময় এপিআই উপস্থাপন করে এই নিবন্ধটি দেখুন ।


2

তারিখের নির্মাণকারীর অবনতি হওয়ায় আপনি এই কোডটি চেষ্টা করতে পারেন।

import java.util.Calendar;

  Calendar calendar = Calendar.getInstance();
     calendar.set(Calendar.HOUR_OF_DAY, 6);// for 6 hour
     calendar.set(Calendar.MINUTE, 0);// for 0 min
     calendar.set(Calendar.SECOND, 0);// for 0 sec
     calendar.set(1996,0,26);// for Date [year,month(0 to 11), date]

    Date date = new Date(calendar.getTimeInMillis());// calendar gives long value

    String mConvertedDate = date.toString();// Fri Jan 26 06:00:00 GMT+05:30 1996

1
এই ভয়ানক ক্লাসগুলি এখন উত্তরাধিকার হিসাবে জেএসআর 310-এ সংজ্ঞায়িত জাভা.টাইম ক্লাসগুলি দ্বারা বহু বছর আগে অনুপ্রবেশ করা হয়েছিল Sug পরামর্শ দেওয়া Dateএবং Calendar2019 সালে দুর্বল পরামর্শ।
বেসিল Bourque

@ বাসিলবার্ক পরামর্শের জন্য ধন্যবাদ, আমি শীঘ্রই এটি আপডেট করার অপেক্ষায় রয়েছি
দিব্যাংশু কুমার

1

বিন্নিব যা পরামর্শ করেছিলেন তার অনুরূপ, আপনি আরও ক্যালেন্ডার> গ্রেগরিয়ানক্যালেন্ডার পদ্ধতি ব্যবহার করে বিবেচনা করতে পারেন। এই আরও সাম্প্রতিক ডক্স দেখুন:

http://download.oracle.com/javase/6/docs/api/java/util/GregorianCalendar.html


1

ক্লাস new Date(year,month,date)ব্যবহার করে আপনি নিজের কোডের মতো একটি পদ্ধতি তৈরি করতে পারেন Calendar

private Date getDate(int year,int month,int date){
    Calendar cal = Calendar.getInstance();
    cal.set(Calendar.YEAR, year);
    cal.set(Calendar.MONTH, month-1);
    cal.set(Calendar.DAY_OF_MONTH, day);
    return cal.getTime();
}

এটি কেবল অবহেলিত কনস্ট্রাক্টরের মতো কাজ করবে Date


1
এই ভয়াবহ ঝামেলাযুক্ত ক্লাসগুলি বহু বছর আগে আধুনিক জাভা.টাইম ক্লাসগুলির দ্বারা বিশেষত Instantএবং ZonedDateTime
বাসিল বাউরক

উপরের সমাধানটি বছরের সাথে 1900 যোগ করা উচিত, এবং মাস থেকে 1 টি বিয়োগ করা উচিত নয়, এবং ক্যালেন্ডার.জিট ইন্স্ট্যান্স () লাইনের পরে ক্যাল ক্লেয়ার () চালানো উচিত, যাতে ঘন্টা / মিনিট / সেকেন্ড / মিলিসেকেন্ড শূন্য হয় (যেমন তারা তারিখ নির্মাণকারী)।
জোয়েল রিচার্ড কোয়েট

1

তারিখ নির্মাতা 1900 সাল থেকে শূন্য-ভিত্তিক মাস, এক-ভিত্তিক দিনগুলি এবং ঘন্টা / মিনিট / সেকেন্ড / মিলিসেকেন্ডগুলিকে শূন্যে সেট করে বছরগুলির ফর্ম্যাটে বছরের প্রত্যাশা করে।

Date result = new Date(year, month, day);

তাই অবহেলিত তারিখ নির্মাতার জন্য ক্যালেন্ডার প্রতিস্থাপন (শূন্য-ভিত্তিক বছর, শূন্য-ভিত্তিক মাস, এক-ভিত্তিক দিন) ব্যবহার করে আমাদের এমন কিছু দরকার:

Calendar calendar = Calendar.getInstance();
calendar.clear(); // Sets hours/minutes/seconds/milliseconds to zero
calendar.set(year + 1900, month, day);
Date result = calendar.getTime();

বা জাভা 1.8 ব্যবহার করে (যা শূন্য-ভিত্তিক বছর, এবং এক-ভিত্তিক মাস এবং দিন রয়েছে):

Date result = Date.from(LocalDate.of(year + 1900, month + 1, day).atStartOfDay(ZoneId.systemDefault()).toInstant());

এখানে তারিখ, ক্যালেন্ডার এবং জাভা 1.8 এর সমান সংস্করণ রয়েছে:

int year = 1985; // 1985
int month = 1; // January
int day = 1; // 1st

// Original, 1900-based year, zero-based month, one-based day
Date date1 = new Date(year - 1900, month - 1, day);

// Calendar, zero-based year, zero-based month, one-based day
Calendar calendar = Calendar.getInstance();
calendar.clear(); // Sets hours/minutes/seconds/milliseconds to zero
calendar.set(year, month - 1, day);
Date date2 = calendar.getTime();

// Java-time back to Date, zero-based year, one-based month, one-based day
Date date3 = Date.from(LocalDate.of(year, month, day).atStartOfDay(ZoneId.systemDefault()).toInstant());

SimpleDateFormat format = new SimpleDateFormat("yyyy-MMM-dd HH:mm:ss.SSS");

// All 3 print "1985-Jan-01 00:00:00.000"
System.out.println(format.format(date1));
System.out.println(format.format(date2));
System.out.println(format.format(date3));

1
এই দু'টি ভয়ঙ্কর শ্রেণীর দুটি বছর পূর্বে জেএসআর 310-এ সংজ্ঞায়িত জাভা.টাইম ক্লাস দ্বারা সংশ্লেষ করা হয়েছিল।
বেসিল বাউরেক

তারিখ, ক্যালেন্ডার এবং জাভা 1.8 সংস্করণ দেখানোর জন্য আপডেট করা উত্তর।
জোয়েল রিচার্ড কোয়েট

0
new GregorianCalendar(1985, Calendar.JANUARY, 1).getTime();

(প্রাক জাভা -8 উপায়)


জাভা.টাইম ছাড়াই এটি করা সেরা। তবে জাভা 8 পূর্বের আগে আপনি জাভা.টাইম ব্যবহার করতে পারেন, এখানে একটি ব্যাকপোর্ট রয়েছে: থ্রিটেন ব্যাকপোর্ট লাইব্রেরি
ওলে ভিভি
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.