Android ikki kunlik kunlarni hisoblaydi

Ikki sana orasida kunlarni topish uchun quyidagi kodni yozdim

    startDateValue = new Date(startDate);
    endDateValue = new Date(endDate);
    long diff = endDateValue.getTime() - startDateValue.getTime();
    long seconds = diff/1000;
    long minutes = seconds/60;
    long hours = minutes/60;
    long days = (hours/24) + 1;
    Log.d("days", "" + days);

Boshlanish va tugatish sanasi 2/3/2017 va 3/3/2017 bo'lib, kunduzgi kunlar soni 29 ga teng. Agar ular xuddi shu kundan boshlab ko'rsatilsa (1). (Bir kunlik ta'til oladigan kunlar soni. agar bir kunlik ta'til oladigan bo'lsa, u boshlang'ich va tugash tarixini tanlashi kerak. Bu holda u ikki kunlik ta'tilni olgan).

Men noto'g'ri ish qilyapman? Vaqtingiz uchun rahmat.

4
FYI, eskirgan eski tarixiy darslar, masalan, < java.util.Calendar va java.text.SimpleDateFormat endi meros , java.time sinflari Java 8 va Java 9 ichiga o'rnatilgan. Qarang Oracle tomonidan tayyorlangan qo'llanma . Anton Balaniuc tomonidan tayyorlangan zamonaviy javobni ko'ring.
qo'shib qo'ydi muallif Basil Bourque, manba
Shunday qilib, siz eskirgan Sana (String) asoschisidan foydalanmoqdasiz? Men buni boshlashni boshlagan bo'lardim. SimpleDateFormat dan foydalanib ma'lum vaqt formatini va UTC vaqtini ishlatishni tavsiya qilaman. (DST-ga o'tish sababli noto'g'ri natija olasiz - bu sizning qaysi vaqt zonasini bilmasdan bilish qiyin.)
qo'shib qo'ydi muallif Jon Skeet, manba
Buni eshitishdan xursandman. Ushbu ijodkor 20 yil oldin bekor qilingan edi :)
qo'shib qo'ydi muallif Jon Skeet, manba
To'g'ri, startDate va endDate nima? (Biz hozir ham ularning turlarini bilmaymiz.) Agar siz uning o'rniga Joda Vaqtini ishlatsangiz, bu lot yaxshi bo'ladi, btw.
qo'shib qo'ydi muallif Jon Skeet, manba
qo'shib qo'ydi muallif Syed Danish Haider, manba
@JonSkeet :) Tashakkur
qo'shib qo'ydi muallif debo.stackoverflow, manba
@JonSkeet OK Men Simple Sana formatini ishlatadigan Sachin javobini amalga oshirdim. Endi boshlab Sana konstruktoridan foydalanilmaydi.
qo'shib qo'ydi muallif debo.stackoverflow, manba
@JonSkeet startDate = (string) 2/3/2017 endDate = (string) 3/3/2017
qo'shib qo'ydi muallif debo.stackoverflow, manba

7 javoblar

Sana obyektini ishlab chiqarish uchun kodingiz:

Date date = new Date("2/3/2017"); //deprecated

Sana (String) asoschisiga ko'ra kun = 3, oy = 2 va yil = 2017

Stringni Sana deb aylantira olasiz:

String dateStr = "2/3/2017";
SimpleDateFormat sdf = new SimpleDateFormat("dd/MM/yyyy");
Date date = sdf.parse(dateStr);

Sana obyektini yaratish uchun shablonning yuqorisidan foydalaning. Keyin, ikki kun orasidagi kunlari hisoblash uchun koddan foydalaning. Umid qilamanki, bu narsa aniq.

Buni quyidagicha bajarish mumkin:

long diff = endDateValue.getTime() - startDateValue.getTime();
System.out.println ("Days: " + TimeUnit.DAYS.convert(diff, TimeUnit.MILLISECONDS));

Please check link

Joda Vaqtidan foydalansangiz, bu juda ham oson:

int days = Days.daysBetween(date1, date2).getDays();

Please check JodaTime

Java loyihasida JodaTime'ni qanday ishlatish kerak

18
qo'shib qo'ydi
Keyinchalik SimpleDateFormat.But keyinchalik undan foydalanishga harakat qilaman. Endi men buni tezda to'g'rilamoqchiman.
qo'shib qo'ydi muallif debo.stackoverflow, manba
Vaqtingiz uchun rahmat. Kun tartibi mening qismimda noto'g'ri edi. Men yuqoriga o'tib, javobingizni qabul qildingiz
qo'shib qo'ydi muallif debo.stackoverflow, manba
Ha, men faqat buni ko'rganman. Agar oyni oy bilan almashtirsam va natija to'g'ri bo'lsa, natija to'g'ri bo'ladi. Formaning nima uchun bu format bo'lishi kerakligini biling. MM/dd/yyyy va dd/mm/yyyy.Avoid kodingizni va sizni ogohlantiradi
qo'shib qo'ydi muallif debo.stackoverflow, manba
DD/AA/yyyy hisoblanadi. Shunday qilib, 2/3/2017 kun = 2, oy = 3 va yil = 2017
qo'shib qo'ydi muallif debo.stackoverflow, manba
startDate = (string) 2/3/2017 endDate = (string) 3/3/2017
qo'shib qo'ydi muallif debo.stackoverflow, manba
2/3/2017,3/3/2017 uchun 28 kun ko'rsatilmoqda. Joda vaqtini kuting va sizga xabar bering
qo'shib qo'ydi muallif debo.stackoverflow, manba
Pf mag'lubiyatga tarixining formati nima? bu "MM/dd/yyyy" ??
qo'shib qo'ydi muallif SachinSarawgi, manba
Ushbu usul SimpleDateFormat-dan foydalanish uchun yaxshiroq eskirgan. Ushbu kodni faqatgina davom ettirmoqchimisiz? Siz bu yerni nazorat qilishingiz mumkin docs.oracle.com/javase/ 7/docs/api/java/util/Date.html
qo'shib qo'ydi muallif SachinSarawgi, manba
Siz derazangiz day = 3, month = 2 and year = 2017
qo'shib qo'ydi muallif SachinSarawgi, manba
Iltimos, Oracle hujjatlarini Sana obyekti bilan tekshiring. Yuqoridagi fikrda allaqachon berilgan havola. Nima uchun format shu kabi ekanligini tushunasiz.
qo'shib qo'ydi muallif SachinSarawgi, manba
Iltimos, startDate va endDate o'zgaruvchining qiymatini tushuntirib bering.
qo'shib qo'ydi muallif SachinSarawgi, manba
Rahmat siz @ debo.stackoverflow. Yordam berganimdan hursandman.
qo'shib qo'ydi muallif SachinSarawgi, manba

Qaysi sana formatini ishlatasiz? D/M/yyyy yoki M/d/yyyy bormi?

d = kun, M = oy, yyyy = yil

(Qarang: https://developer.android.com/reference/java/text /SimpleDateFormat.html )

Keyin kodlar:

public static final String DATE_FORMAT = "d/M/yyyy";  //or use "M/d/yyyy"   

public static long getDaysBetweenDates(String start, String end) {
    SimpleDateFormat dateFormat = new SimpleDateFormat(DATE_FORMAT, Locale.ENGLISH);
    Date startDate, endDate;
    long numberOfDays = 0;
    try {
        startDate = dateFormat.parse(start);
        endDate = dateFormat.parse(end);
        numberOfDays = getUnitBetweenDates(startDate, endDate, TimeUnit.DAYS);
    } catch (ParseException e) {
        e.printStackTrace();
    }
    return numberOfDays;
}

Va getUnitBetweenDates usuli uchun:

private static long getUnitBetweenDates(Date startDate, Date endDate, TimeUnit unit) {
    long timeDiff = endDate.getTime() - startDate.getTime();
    return unit.convert(timeDiff, TimeUnit.MILLISECONDS);
}
4
qo'shib qo'ydi

Android to'liq java-8 ni qo'llab-quvvatlamaydi? Ha bo'lsa, ChronoUnit sinfi

LocalDate start = LocalDate.of(2017,2,3);
LocalDate end = LocalDate.of(2017,3,3);

System.out.println(ChronoUnit.DAYS.between(start, end));//28

yoki formatlash usuli bilan bir xil narsa

DateTimeFormatter formatter = DateTimeFormatter.ofPattern("M/d/yyyy");
LocalDate start = LocalDate.parse("2/3/2017",formatter);
LocalDate end = LocalDate.parse("3/3/2017",formatter);

System.out.println(ChronoUnit.DAYS.between(start, end));//28
2
qo'shib qo'ydi
FYI, java.util.Date , java.util.Calendar va java.text.SimpleDateFormat kabi eskirgan eski sana- java.time darslari. java.time funksiyasining ko'p qismi Java 6 va Java 7-ga UchTen-Backport loyihasini ko'rishingiz mumkin. Bundan oldingi Android uchun ThreeTenABP tizimida moslashtirildi. loyiha. ThreeTenABP qanday ishlatiladi ... ga qarang.
qo'shib qo'ydi muallif Basil Bourque, manba
Androidda mavjud emas.
qo'shib qo'ydi muallif Meno Hochschild, manba

Ushbu kodni ko'rib chiqing, bu menga yordam beradi, umid qilaman.

public String get_count_of_days(String Created_date_String, String Expire_date_String) {
SimpleDateFormat dateFormat = new SimpleDateFormat("dd/MM/yyyy", Locale.getDefault());

Date Created_convertedDate = null, Expire_CovertedDate = null, todayWithZeroTime = null;
try {
    Created_convertedDate = dateFormat.parse(Created_date_String);
    Expire_CovertedDate = dateFormat.parse(Expire_date_String);

    Date today = new Date();

    todayWithZeroTime = dateFormat.parse(dateFormat.format(today));
} catch (ParseException e) {
    e.printStackTrace();
}

int c_year = 0, c_month = 0, c_day = 0;

if (Created_convertedDate.after(todayWithZeroTime)) {
    Calendar c_cal = Calendar.getInstance();
    c_cal.setTime(Created_convertedDate);
    c_year = c_cal.get(Calendar.YEAR);
    c_month = c_cal.get(Calendar.MONTH);
    c_day = c_cal.get(Calendar.DAY_OF_MONTH);

} else {
    Calendar c_cal = Calendar.getInstance();
    c_cal.setTime(todayWithZeroTime);
    c_year = c_cal.get(Calendar.YEAR);
    c_month = c_cal.get(Calendar.MONTH);
    c_day = c_cal.get(Calendar.DAY_OF_MONTH);
}


/*Calendar today_cal = Calendar.getInstance();
int today_year = today_cal.get(Calendar.YEAR);
int today = today_cal.get(Calendar.MONTH);
int today_day = today_cal.get(Calendar.DAY_OF_MONTH);
*/

Calendar e_cal = Calendar.getInstance();
e_cal.setTime(Expire_CovertedDate);

int e_year = e_cal.get(Calendar.YEAR);
int e_month = e_cal.get(Calendar.MONTH);
int e_day = e_cal.get(Calendar.DAY_OF_MONTH);

Calendar date1 = Calendar.getInstance();
Calendar date2 = Calendar.getInstance();

date1.clear();
date1.set(c_year, c_month, c_day);
date2.clear();
date2.set(e_year, e_month, e_day);

long diff = date2.getTimeInMillis() - date1.getTimeInMillis();

float dayCount = (float) diff/(24 * 60 * 60 * 1000);

return ("" + (int) dayCount + " Days");

}

2
qo'shib qo'ydi
Ushbu kodni sinab ko'rganimdan va bu ishlayotganidan tashakkur. Men uni yuqoriga ko'targan edim, lekin eng oddiy javobni qabul qildim
qo'shib qo'ydi muallif debo.stackoverflow, manba
public static int getDaysDifference(Date fromDate,Date toDate)
{
if(fromDate==null||toDate==null)
return 0;

return (int)( (toDate.getTime() - fromDate.getTime())/(1000 * 60 * 60 * 24));
}
2
qo'shib qo'ydi

Juda oddiy, faqat Taqvimdan foydalaning, ikkita misol uchun ikkita misolni yaratish, millisekundlarga aylantirish, kundan-kunga ayirish va aylantirish (aylantirildi) ... bunga asosan:

Calendar startDate = Calendar.getInstance();
startDate.set(mStartYear, mStartMonth, mStartDay);
long startDateMillis = startDate.getTimeInMillis();

Calendar endDate = Calendar.getInstance();
endDate.set(mEndYear, mEndMonth, mEndDay);
long endDateMillis = endDate.getTimeInMillis();

long differenceMillis = endDateMillis - startDateMillis;
int daysDifference = (int) (differenceMillis/(1000 * 60 * 60 * 24));
1
qo'shib qo'ydi

Qabul qilingan tamsayıni ishlatmoqchi bo'lsangiz, ehtiyot bo'ling. maxsus kalendar dasturida ma'lum kunni ko'rsatish. Masalan, men har oylik kalendar ko'rinishidan kundalik ko'rinishga o'tishga harakat qildim va 1970-01-01 kunlarini tanlangangacha hisoblab, har kungi tarkibni ko'rsata oldim va har oyning 25-31 kunlari meni bir kun oldin, chunki datesDifferenceInMillis/(24 * 60 * 60 * 1000); 17645,95833333333 kabi bir narsani qaytarishi mumkin va uni int ga almashtirish uchun siz qiymatni 1 ga tenglashtirasiz. Bu holda siz NumberFormat sinfidan foydalanib, olingan floatning yaxlitlash yo'li bilan olinadi. Mana mening kodim:

NumberFormat numberFormat = NumberFormat.getInstance(Locale.getDefault());
numberFormat.setRoundingMode(RoundingMode.HALF_UP);
numberFormat.setMaximumFractionDigits(0);
numberFormat.setMinimumFractionDigits(0);
int days = numberFormat.parse(numberFormat.format(value)).intValue();

Umid qilamanki, bu foydali bo'ladi.

0
qo'shib qo'ydi
Kunlar 24 soat davom etmaydi, shuning uchun bu aniq emas. ChronoUnit.DAYS.b o'rtasida (boshlash, to'xtatish) dan foydalanish juda oson.
qo'shib qo'ydi muallif Basil Bourque, manba