ใน Ruby on Rails มีคุณลักษณะที่ให้คุณใช้วันที่และพิมพ์ว่า "นานมาแล้ว" เป็นอย่างไร
ตัวอย่างเช่น:
8 minutes ago
8 hours ago
8 days ago
8 months ago
8 years ago
มีวิธีง่ายๆในการทำเช่นนี้ใน Java หรือไม่?
ใน Ruby on Rails มีคุณลักษณะที่ให้คุณใช้วันที่และพิมพ์ว่า "นานมาแล้ว" เป็นอย่างไร
ตัวอย่างเช่น:
8 minutes ago
8 hours ago
8 days ago
8 months ago
8 years ago
มีวิธีง่ายๆในการทำเช่นนี้ใน Java หรือไม่?
คำตอบ:
ดูไลบรารีPrettyTime
ใช้งานง่ายมาก:
import org.ocpsoft.prettytime.PrettyTime;
PrettyTime p = new PrettyTime();
System.out.println(p.format(new Date()));
// prints "moments ago"
คุณยังสามารถส่งผ่านภาษาสำหรับข้อความสากลได้ด้วย:
PrettyTime p = new PrettyTime(new Locale("fr"));
System.out.println(p.format(new Date()));
// prints "à l'instant"
ตามที่ระบุไว้ในความคิดเห็น Android มีฟังก์ชันนี้ในตัวandroid.text.format.DateUtils
คลาส
คุณได้พิจารณาTimeUnit enum แล้วหรือยัง? มันมีประโยชน์มากสำหรับเรื่องแบบนี้
try {
SimpleDateFormat format = new SimpleDateFormat("dd/MM/yyyy");
Date past = format.parse("01/10/2010");
Date now = new Date();
System.out.println(TimeUnit.MILLISECONDS.toMillis(now.getTime() - past.getTime()) + " milliseconds ago");
System.out.println(TimeUnit.MILLISECONDS.toMinutes(now.getTime() - past.getTime()) + " minutes ago");
System.out.println(TimeUnit.MILLISECONDS.toHours(now.getTime() - past.getTime()) + " hours ago");
System.out.println(TimeUnit.MILLISECONDS.toDays(now.getTime() - past.getTime()) + " days ago");
}
catch (Exception j){
j.printStackTrace();
}
ฉันใช้คำตอบ RealHowTo และ Ben J และสร้างเวอร์ชันของฉันเอง:
public class TimeAgo {
public static final List<Long> times = Arrays.asList(
TimeUnit.DAYS.toMillis(365),
TimeUnit.DAYS.toMillis(30),
TimeUnit.DAYS.toMillis(1),
TimeUnit.HOURS.toMillis(1),
TimeUnit.MINUTES.toMillis(1),
TimeUnit.SECONDS.toMillis(1) );
public static final List<String> timesString = Arrays.asList("year","month","day","hour","minute","second");
public static String toDuration(long duration) {
StringBuffer res = new StringBuffer();
for(int i=0;i< TimeAgo.times.size(); i++) {
Long current = TimeAgo.times.get(i);
long temp = duration/current;
if(temp>0) {
res.append(temp).append(" ").append( TimeAgo.timesString.get(i) ).append(temp != 1 ? "s" : "").append(" ago");
break;
}
}
if("".equals(res.toString()))
return "0 seconds ago";
else
return res.toString();
}
public static void main(String args[]) {
System.out.println(toDuration(123));
System.out.println(toDuration(1230));
System.out.println(toDuration(12300));
System.out.println(toDuration(123000));
System.out.println(toDuration(1230000));
System.out.println(toDuration(12300000));
System.out.println(toDuration(123000000));
System.out.println(toDuration(1230000000));
System.out.println(toDuration(12300000000L));
System.out.println(toDuration(123000000000L));
}}
ซึ่งจะพิมพ์ต่อไปนี้
0 second ago
1 second ago
12 seconds ago
2 minutes ago
20 minutes ago
3 hours ago
1 day ago
14 days ago
4 months ago
3 years ago
.append(temp != 1 ? "s" : "")
แทน.append(temp > 1 ? "s" : "")
เพราะ 0 ควรมีs
คำต่อท้ายด้วย
public class TimeUtils {
public final static long ONE_SECOND = 1000;
public final static long SECONDS = 60;
public final static long ONE_MINUTE = ONE_SECOND * 60;
public final static long MINUTES = 60;
public final static long ONE_HOUR = ONE_MINUTE * 60;
public final static long HOURS = 24;
public final static long ONE_DAY = ONE_HOUR * 24;
private TimeUtils() {
}
/**
* converts time (in milliseconds) to human-readable format
* "<w> days, <x> hours, <y> minutes and (z) seconds"
*/
public static String millisToLongDHMS(long duration) {
StringBuffer res = new StringBuffer();
long temp = 0;
if (duration >= ONE_SECOND) {
temp = duration / ONE_DAY;
if (temp > 0) {
duration -= temp * ONE_DAY;
res.append(temp).append(" day").append(temp > 1 ? "s" : "")
.append(duration >= ONE_MINUTE ? ", " : "");
}
temp = duration / ONE_HOUR;
if (temp > 0) {
duration -= temp * ONE_HOUR;
res.append(temp).append(" hour").append(temp > 1 ? "s" : "")
.append(duration >= ONE_MINUTE ? ", " : "");
}
temp = duration / ONE_MINUTE;
if (temp > 0) {
duration -= temp * ONE_MINUTE;
res.append(temp).append(" minute").append(temp > 1 ? "s" : "");
}
if (!res.toString().equals("") && duration >= ONE_SECOND) {
res.append(" and ");
}
temp = duration / ONE_SECOND;
if (temp > 0) {
res.append(temp).append(" second").append(temp > 1 ? "s" : "");
}
return res.toString();
} else {
return "0 second";
}
}
public static void main(String args[]) {
System.out.println(millisToLongDHMS(123));
System.out.println(millisToLongDHMS((5 * ONE_SECOND) + 123));
System.out.println(millisToLongDHMS(ONE_DAY + ONE_HOUR));
System.out.println(millisToLongDHMS(ONE_DAY + 2 * ONE_SECOND));
System.out.println(millisToLongDHMS(ONE_DAY + ONE_HOUR + (2 * ONE_MINUTE)));
System.out.println(millisToLongDHMS((4 * ONE_DAY) + (3 * ONE_HOUR)
+ (2 * ONE_MINUTE) + ONE_SECOND));
System.out.println(millisToLongDHMS((5 * ONE_DAY) + (4 * ONE_HOUR)
+ ONE_MINUTE + (23 * ONE_SECOND) + 123));
System.out.println(millisToLongDHMS(42 * ONE_DAY));
/*
output :
0 second
5 seconds
1 day, 1 hour
1 day and 2 seconds
1 day, 1 hour, 2 minutes
4 days, 3 hours, 2 minutes and 1 second
5 days, 4 hours, 1 minute and 23 seconds
42 days
*/
}
}
more @ จัดรูปแบบระยะเวลาเป็นมิลลิวินาทีเป็นรูปแบบที่มนุษย์อ่านได้
นี่เป็นไปตามคำตอบของ RealHowTo ดังนั้นหากคุณชอบก็ควรมอบความรักให้เขา / เธอด้วย
เวอร์ชันที่ล้างข้อมูลนี้ช่วยให้คุณระบุช่วงเวลาที่คุณอาจสนใจได้
นอกจากนี้ยังจัดการส่วน "และ" ที่แตกต่างกันเล็กน้อย ฉันมักจะพบว่าเมื่อรวมสตริงด้วยตัวคั่นมันง่ายกว่าที่จะข้ามตรรกะที่ซับซ้อนและเพียงแค่ลบตัวคั่นสุดท้ายเมื่อคุณทำเสร็จแล้ว
import java.util.concurrent.TimeUnit;
import static java.util.concurrent.TimeUnit.MILLISECONDS;
public class TimeUtils {
/**
* Converts time to a human readable format within the specified range
*
* @param duration the time in milliseconds to be converted
* @param max the highest time unit of interest
* @param min the lowest time unit of interest
*/
public static String formatMillis(long duration, TimeUnit max, TimeUnit min) {
StringBuilder res = new StringBuilder();
TimeUnit current = max;
while (duration > 0) {
long temp = current.convert(duration, MILLISECONDS);
if (temp > 0) {
duration -= current.toMillis(temp);
res.append(temp).append(" ").append(current.name().toLowerCase());
if (temp < 2) res.deleteCharAt(res.length() - 1);
res.append(", ");
}
if (current == min) break;
current = TimeUnit.values()[current.ordinal() - 1];
}
// clean up our formatting....
// we never got a hit, the time is lower than we care about
if (res.lastIndexOf(", ") < 0) return "0 " + min.name().toLowerCase();
// yank trailing ", "
res.deleteCharAt(res.length() - 2);
// convert last ", " to " and"
int i = res.lastIndexOf(", ");
if (i > 0) {
res.deleteCharAt(i);
res.insert(i, " and");
}
return res.toString();
}
}
รหัสเล็ก ๆ น้อย ๆ ที่จะทำให้มันหมุนวน:
import static java.util.concurrent.TimeUnit.*;
public class Main {
public static void main(String args[]) {
long[] durations = new long[]{
123,
SECONDS.toMillis(5) + 123,
DAYS.toMillis(1) + HOURS.toMillis(1),
DAYS.toMillis(1) + SECONDS.toMillis(2),
DAYS.toMillis(1) + HOURS.toMillis(1) + MINUTES.toMillis(2),
DAYS.toMillis(4) + HOURS.toMillis(3) + MINUTES.toMillis(2) + SECONDS.toMillis(1),
DAYS.toMillis(5) + HOURS.toMillis(4) + MINUTES.toMillis(1) + SECONDS.toMillis(23) + 123,
DAYS.toMillis(42)
};
for (long duration : durations) {
System.out.println(TimeUtils.formatMillis(duration, DAYS, SECONDS));
}
System.out.println("\nAgain in only hours and minutes\n");
for (long duration : durations) {
System.out.println(TimeUtils.formatMillis(duration, HOURS, MINUTES));
}
}
}
ซึ่งจะส่งออกดังต่อไปนี้:
0 seconds
5 seconds
1 day and 1 hour
1 day and 2 seconds
1 day, 1 hour and 2 minutes
4 days, 3 hours, 2 minutes and 1 second
5 days, 4 hours, 1 minute and 23 seconds
42 days
Again in only hours and minutes
0 minutes
0 minutes
25 hours
24 hours
25 hours and 2 minutes
99 hours and 2 minutes
124 hours and 1 minute
1008 hours
และในกรณีที่ทุกคนต้องการมันนี่คือคลาสที่จะแปลงสตริงใด ๆ ตามที่กล่าวมา กลับเข้ามาในมิลลิวินาที มันมีประโยชน์มากสำหรับการอนุญาตให้ผู้คนระบุการหมดเวลาของสิ่งต่างๆในข้อความที่อ่านได้
มีวิธีง่ายๆในการทำสิ่งนี้:
สมมติว่าคุณต้องการเวลาเมื่อ 20 นาทีที่แล้ว:
Long minutesAgo = new Long(20);
Date date = new Date();
Date dateIn_X_MinAgo = new Date (date.getTime() - minutesAgo*60*1000);
แค่นั้นแหละ..
เกี่ยวกับโซลูชันในตัว :
Java ไม่มีการสนับสนุนในตัวสำหรับการจัดรูปแบบเวลาสัมพัทธ์ไม่ใช่ Java-8 และแพ็คเกจใหม่ java.time
และแพคเกจใหม่ของมันไม่ได้ หากคุณต้องการเพียงแค่ภาษาอังกฤษและไม่มีอะไรอื่นจากนั้นวิธีแก้ปัญหาที่ทำด้วยมือเท่านั้นที่สามารถยอมรับได้ - ดูคำตอบของ @RealHowTo (แม้ว่าจะมีข้อเสียอย่างมากที่จะไม่คำนึงถึงเขตเวลาสำหรับการแปลเดลต้าทันทีเป็นเวลาท้องถิ่น หน่วย!) อย่างไรก็ตามหากคุณต้องการหลีกเลี่ยงวิธีแก้ปัญหาที่ซับซ้อนในบ้านโดยเฉพาะสำหรับสถานที่อื่นคุณต้องมีไลบรารีภายนอก
ในกรณีหลังนี้ฉันขอแนะนำให้ใช้ไลบรารีของฉันTime4J (หรือ Time4A บน Android) มีความยืดหยุ่นสูงสุดและ i18n-powerมากที่สุด คลาสnet.time4j.PrettyTimeมีเจ็ดวิธีprintRelativeTime...(...)
สำหรับวัตถุประสงค์นี้ ตัวอย่างการใช้นาฬิกาทดสอบเป็นแหล่งเวลา:
TimeSource<?> clock = () -> PlainTimestamp.of(2015, 8, 1, 10, 24, 5).atUTC();
Moment moment = PlainTimestamp.of(2015, 8, 1, 17, 0).atUTC(); // our input
String durationInDays =
PrettyTime.of(Locale.GERMAN).withReferenceClock(clock).printRelative(
moment,
Timezone.of(EUROPE.BERLIN),
TimeUnit.DAYS); // controlling the precision
System.out.println(durationInDays); // heute (german word for today)
อีกตัวอย่างหนึ่งที่ใช้java.time.Instant
เป็นอินพุต:
String relativeTime =
PrettyTime.of(Locale.ENGLISH)
.printRelativeInStdTimezone(Moment.from(Instant.EPOCH));
System.out.println(relativeTime); // 45 years ago
ไลบรารีนี้รองรับผ่านเวอร์ชันล่าสุด (v4.17) 80 ภาษาและยังมีบางภาษาเฉพาะบางประเทศ (โดยเฉพาะสำหรับสเปนอังกฤษอาหรับฝรั่งเศส) i18n-data ส่วนใหญ่ใช้CLDR-version v29ล่าสุด เหตุผลที่สำคัญอื่น ๆ ว่าทำไมการใช้ห้องสมุดนี้เป็นสิ่งที่ดีการสนับสนุนสำหรับกฎพหูพจน์ (ซึ่งมักจะแตกต่างจากภาษาอังกฤษในสถานที่อื่น ๆ ) สไตล์รูปแบบย่อ (ตัวอย่างเช่น: "1 วินาทีที่ผ่านมา") และวิธีการแสดงออกสำหรับการเข้าสู่เขตเวลาบัญชี Time4J ยังตระหนักถึงรายละเอียดที่แปลกใหม่เช่นอธิกวินาทีในการคำนวณเวลาสัมพัทธ์ (ไม่สำคัญจริงๆ แต่เป็นข้อความที่เกี่ยวข้องกับขอบฟ้าความคาดหวัง) เข้ากันได้กับ Java-8มีอยู่เนื่องจากการใช้ได้ง่ายวิธีการแปลงชนิดเช่นหรือjava.time.Instant
java.time.Period
มีข้อบกพร่องหรือไม่? แค่สอง.
(กะทัดรัด) ทางเลือก:
หากคุณมองหาโซลูชันที่เล็กกว่าและไม่ต้องการคุณสมบัติมากมายและยินดีที่จะยอมรับปัญหาด้านคุณภาพที่อาจเกิดขึ้นเกี่ยวกับ i18n-data แล้ว:
ฉันอยากจะแนะนำocpsoft / PrettyTime (รองรับ 32 ภาษาจริง ๆ (เร็ว ๆ นี้ 34?) เหมาะสำหรับการทำงานกับjava.util.Date
เท่านั้น - ดูคำตอบของ @ataylor) CLDR มาตรฐานอุตสาหกรรม (จาก Unicode consortium) ที่มีภูมิหลังของชุมชนขนาดใหญ่นั้นไม่ได้เป็นฐานของข้อมูล i18n ดังนั้นการปรับปรุงหรือปรับปรุงข้อมูลเพิ่มเติมอาจใช้เวลาสักครู่ ...
หากคุณใช้ Android คลาสผู้ช่วยandroid.text.format.DateUtilsเป็นทางเลือกในตัวที่บางเฉียบ (ดูความคิดเห็นและคำตอบอื่น ๆ ได้ที่นี่โดยมีข้อเสียคือไม่มีการรองรับเป็นเวลาหลายปีและหลายเดือนและฉันมั่นใจว่ามีเพียง มีเพียงไม่กี่คนที่ชอบรูปแบบ API ของคลาสตัวช่วยนี้
หากคุณเป็นแฟนตัวยงของJoda-TimeคุณสามารถดูคลาสPeriodFormat ได้ (รองรับ 14 ภาษาในรุ่น v2.9.4 ในอีกด้านหนึ่ง: Joda-Time ก็ไม่กะทัดรัดเช่นกันดังนั้นฉันจึงพูดถึงที่นี่เพื่อ ครบถ้วน) ห้องสมุดนี้ไม่ใช่คำตอบที่แท้จริงเนื่องจากไม่รองรับเวลาสัมพัทธ์เลย คุณจะต้องต่อท้าย "ที่ผ่านมา" ตามตัวอักษรเป็นอย่างน้อย (และลบหน่วยที่ต่ำกว่าทั้งหมดออกจากรูปแบบรายการที่สร้างขึ้นด้วยตนเอง - อึดอัด) ไม่เหมือนกับ Time4J หรือ Android-DateUtils ไม่มีการสนับสนุนพิเศษสำหรับตัวย่อหรือการเปลี่ยนอัตโนมัติจากเวลาสัมพัทธ์เป็นการแสดงเวลาแบบสัมบูรณ์ เช่นเดียวกับ PrettyTime มันขึ้นอยู่กับการมีส่วนร่วมที่ไม่ได้รับการยืนยันของสมาชิกส่วนตัวของชุมชน Java ต่อ i18n-data
หากคุณกำลังมองหา "วันนี้" "เมื่อวาน" หรือ "x days ago" ที่เรียบง่าย
private String getDaysAgo(Date date){
long days = (new Date().getTime() - date.getTime()) / 86400000;
if(days == 0) return "Today";
else if(days == 1) return "Yesterday";
else return days + " days ago";
}
ใช้java.time framework ที่สร้างใน Java 8 และใหม่กว่า
LocalDateTime t1 = LocalDateTime.of(2015, 1, 1, 0, 0, 0);
LocalDateTime t2 = LocalDateTime.now();
Period period = Period.between(t1.toLocalDate(), t2.toLocalDate());
Duration duration = Duration.between(t1, t2);
System.out.println("First January 2015 is " + period.getYears() + " years ago");
System.out.println("First January 2015 is " + period.getMonths() + " months ago");
System.out.println("First January 2015 is " + period.getDays() + " days ago");
System.out.println("First January 2015 is " + duration.toHours() + " hours ago");
System.out.println("First January 2015 is " + duration.toMinutes() + " minutes ago");
Duration
วิธีการเหล่านั้นรายงานระยะเวลาทั้งหมดเป็นจำนวนชั่วโมงทั้งหมดและเป็นจำนวนนาทีทั้งหมด ใน Java 8 คลาสนั้นไม่มีเมธอดใด ๆ ในการรับแต่ละส่วนของชั่วโมงและนาทีและวินาที Java 9 นำวิธีการเหล่านั้น, to…Part
.
จากคำตอบมากมายที่นี่ฉันได้สร้างสิ่งต่อไปนี้สำหรับกรณีการใช้งานของฉัน
ตัวอย่างการใช้งาน:
String relativeDate = String.valueOf(
TimeUtils.getRelativeTime( 1000L * myTimeInMillis() ));
import java.util.Arrays;
import java.util.List;
import static java.util.concurrent.TimeUnit.DAYS;
import static java.util.concurrent.TimeUnit.HOURS;
import static java.util.concurrent.TimeUnit.MINUTES;
import static java.util.concurrent.TimeUnit.SECONDS;
/**
* Utilities for dealing with dates and times
*/
public class TimeUtils {
public static final List<Long> times = Arrays.asList(
DAYS.toMillis(365),
DAYS.toMillis(30),
DAYS.toMillis(7),
DAYS.toMillis(1),
HOURS.toMillis(1),
MINUTES.toMillis(1),
SECONDS.toMillis(1)
);
public static final List<String> timesString = Arrays.asList(
"yr", "mo", "wk", "day", "hr", "min", "sec"
);
/**
* Get relative time ago for date
*
* NOTE:
* if (duration > WEEK_IN_MILLIS) getRelativeTimeSpanString prints the date.
*
* ALT:
* return getRelativeTimeSpanString(date, now, SECOND_IN_MILLIS, FORMAT_ABBREV_RELATIVE);
*
* @param date String.valueOf(TimeUtils.getRelativeTime(1000L * Date/Time in Millis)
* @return relative time
*/
public static CharSequence getRelativeTime(final long date) {
return toDuration( Math.abs(System.currentTimeMillis() - date) );
}
private static String toDuration(long duration) {
StringBuilder sb = new StringBuilder();
for(int i=0;i< times.size(); i++) {
Long current = times.get(i);
long temp = duration / current;
if (temp > 0) {
sb.append(temp)
.append(" ")
.append(timesString.get(i))
.append(temp > 1 ? "s" : "")
.append(" ago");
break;
}
}
return sb.toString().isEmpty() ? "now" : sb.toString();
}
}
ฉันสร้างพอร์ตJava timeagoแบบง่ายของปลั๊กอินjquery-timeagoที่ทำในสิ่งที่คุณต้องการ
TimeAgo time = new TimeAgo();
String minutes = time.timeAgo(System.currentTimeMillis() - (15*60*1000)); // returns "15 minutes ago"
ในกรณีที่คุณกำลังพัฒนาแอปสำหรับ Android แอปจะมีDateUtilsคลาสยูทิลิตี้สำหรับข้อกำหนดดังกล่าวทั้งหมด ลองดูวิธียูทิลิตี้DateUtils # getRelativeTimeSpanString ()
จากเอกสารสำหรับ
CharSequence getRelativeTimeSpanString (เวลานาน, นานแล้ว, ยาว minResolution)
ส่งคืนสตริงที่อธิบาย 'เวลา' เป็นเวลาที่สัมพันธ์กับ 'ตอนนี้' ช่วงเวลาในอดีตจะมีรูปแบบเหมือน "42 นาทีที่แล้ว" ระยะเวลาในอนาคตจะอยู่ในรูปแบบ "ใน 42 นาที"
คุณจะได้รับการส่งผ่านของคุณtimestamp
เป็นเวลาและSystem.currentTimeMillis()
เป็นตอนนี้ minResolution
ช่วยให้คุณระบุช่วงเวลาขั้นต่ำในการรายงาน
ตัวอย่างเช่นเวลา 3 วินาทีในอดีตจะถูกรายงานว่า "0 นาทีที่แล้ว" หากตั้งค่าเป็น MINUTE_IN_MILLIS ผ่านหนึ่งใน 0 MINUTE_IN_MILLIS HOUR_IN_MILLIS DAY_IN_MILLIS WEEK_IN_MILLIS เป็นต้น
คุณสามารถใช้ฟังก์ชันนี้เพื่อคำนวณเวลาที่ผ่านมา
private String timeAgo(long time_ago) {
long cur_time = (Calendar.getInstance().getTimeInMillis()) / 1000;
long time_elapsed = cur_time - time_ago;
long seconds = time_elapsed;
int minutes = Math.round(time_elapsed / 60);
int hours = Math.round(time_elapsed / 3600);
int days = Math.round(time_elapsed / 86400);
int weeks = Math.round(time_elapsed / 604800);
int months = Math.round(time_elapsed / 2600640);
int years = Math.round(time_elapsed / 31207680);
// Seconds
if (seconds <= 60) {
return "just now";
}
//Minutes
else if (minutes <= 60) {
if (minutes == 1) {
return "one minute ago";
} else {
return minutes + " minutes ago";
}
}
//Hours
else if (hours <= 24) {
if (hours == 1) {
return "an hour ago";
} else {
return hours + " hrs ago";
}
}
//Days
else if (days <= 7) {
if (days == 1) {
return "yesterday";
} else {
return days + " days ago";
}
}
//Weeks
else if (weeks <= 4.3) {
if (weeks == 1) {
return "a week ago";
} else {
return weeks + " weeks ago";
}
}
//Months
else if (months <= 12) {
if (months == 1) {
return "a month ago";
} else {
return months + " months ago";
}
}
//Years
else {
if (years == 1) {
return "one year ago";
} else {
return years + " years ago";
}
}
}
1) ที่นี่ time_ago มีหน่วยเป็นไมโครวินาที
มันไม่สวย ... แต่สิ่งที่ใกล้เคียงที่สุดที่ฉันคิดได้คือการใช้ Joda-Time (ตามที่อธิบายไว้ในโพสต์นี้: จะคำนวณเวลาที่ผ่านไปจากนี้ด้วย Joda Time ได้อย่างไร?
นี่เป็นรหัสที่ดีกว่าหากเราพิจารณาถึงประสิทธิภาพซึ่งจะช่วยลดจำนวนการคำนวณ นาทีเหตุผลจะคำนวณเฉพาะในกรณีที่จำนวนวินาทีมากกว่า 60 และชั่วโมงจะคำนวณเฉพาะเมื่อจำนวนนาทีมากกว่า 60 เป็นต้นไป ...
class timeAgo {
static String getTimeAgo(long time_ago) {
time_ago=time_ago/1000;
long cur_time = (Calendar.getInstance().getTimeInMillis())/1000 ;
long time_elapsed = cur_time - time_ago;
long seconds = time_elapsed;
// Seconds
if (seconds <= 60) {
return "Just now";
}
//Minutes
else{
int minutes = Math.round(time_elapsed / 60);
if (minutes <= 60) {
if (minutes == 1) {
return "a minute ago";
} else {
return minutes + " minutes ago";
}
}
//Hours
else {
int hours = Math.round(time_elapsed / 3600);
if (hours <= 24) {
if (hours == 1) {
return "An hour ago";
} else {
return hours + " hrs ago";
}
}
//Days
else {
int days = Math.round(time_elapsed / 86400);
if (days <= 7) {
if (days == 1) {
return "Yesterday";
} else {
return days + " days ago";
}
}
//Weeks
else {
int weeks = Math.round(time_elapsed / 604800);
if (weeks <= 4.3) {
if (weeks == 1) {
return "A week ago";
} else {
return weeks + " weeks ago";
}
}
//Months
else {
int months = Math.round(time_elapsed / 2600640);
if (months <= 12) {
if (months == 1) {
return "A month ago";
} else {
return months + " months ago";
}
}
//Years
else {
int years = Math.round(time_elapsed / 31207680);
if (years == 1) {
return "One year ago";
} else {
return years + " years ago";
}
}
}
}
}
}
}
}
}
คำตอบโดย Habsqมีความคิดที่ถูก แต่วิธีการที่ไม่ถูกต้อง
สำหรับช่วงของเวลาโสดในไทม์ไลน์โยของปีเดือนวัน, Period
การใช้งาน สำหรับวันที่มีความหมายชิ้นตลอด 24 Duration
ชั่วโมงของเวลาที่ไม่เกี่ยวข้องกับปฏิทินและชั่วโมงนาทีวินาทีใช้ การผสมเครื่องชั่งทั้งสองไม่ค่อยเข้าท่า
Duration
เริ่มต้นด้วยการดึงข้อมูลช่วงเวลาปัจจุบันตามที่เห็นในUTCโดยใช้Instant
คลาส
Instant now = Instant.now(); // Capture the current moment as seen in UTC.
Instant then = now.minus( 8L , ChronoUnit.HOURS ).minus( 8L , ChronoUnit.MINUTES ).minus( 8L , ChronoUnit.SECONDS );
Duration d = Duration.between( then , now );
สร้างข้อความเป็นชั่วโมงนาทีและวินาที
// Generate text by calling `to…Part` methods.
String output = d.toHoursPart() + " hours ago\n" + d.toMinutesPart() + " minutes ago\n" + d.toSecondsPart() + " seconds ago";
ถ่ายโอนไปยังคอนโซล
System.out.println( "From: " + then + " to: " + now );
System.out.println( output );
From: 2019-06-04T11: 53: 55.714965Z ถึง: 2019-06-04T20: 02: 03.714965Z
8 ชั่วโมงที่แล้ว
8 นาทีที่แล้ว
8 วินาทีที่แล้ว
Period
เริ่มต้นด้วยการรับวันที่ปัจจุบัน
เขตเวลามีความสำคัญอย่างยิ่งในการกำหนดวันที่ ในช่วงเวลาใดวันที่จะแตกต่างกันไปทั่วโลกตามโซน ตัวอย่างเช่นไม่กี่นาทีหลังเที่ยงคืนในปารีสฝรั่งเศสเป็นวันใหม่ในขณะที่ยัง "เมื่อวาน" ในMontréalQuébecมอนทรีออควิเบก
หากไม่ได้ระบุเขตเวลา JVM จะใช้โซนเวลาเริ่มต้นปัจจุบันโดยปริยาย ค่าเริ่มต้นนั้นอาจเปลี่ยนแปลงได้ตลอดเวลาระหว่างรันไทม์ (!) ดังนั้นผลลัพธ์ของคุณอาจแตกต่างกันไป ควรระบุเขตเวลาที่คุณต้องการ / ที่คาดไว้อย่างชัดเจนเป็นอาร์กิวเมนต์ หากสำคัญให้ยืนยันโซนกับผู้ใช้ของคุณ
ระบุชื่อโซนเวลาที่เหมาะสมในรูปแบบของContinent/Region
เช่นAmerica/Montreal
, หรือAfrica/Casablanca
Pacific/Auckland
อย่าใช้ตัวย่อ 2-4 ตัวอักษรเช่นEST
หรือIST
เนื่องจากไม่ใช่เขตเวลาจริงไม่เป็นมาตรฐานและไม่ซ้ำกัน (!)
ZoneId z = ZoneId.of( "America/Montreal" ) ;
LocalDate today = LocalDate.now( z ) ;
สร้างวันที่เมื่อแปดวันเดือนและปีที่แล้ว
LocalDate then = today.minusYears( 8 ).minusMonths( 8 ).minusDays( 7 ); // Notice the 7 days, not 8, because of granularity of months.
คำนวณเวลาที่ผ่านไป
Period p = Period.between( then , today );
สร้างสตริงของชิ้นส่วน "เวลาที่แล้ว"
String output = p.getDays() + " days ago\n" + p.getMonths() + " months ago\n" + p.getYears() + " years ago";
ถ่ายโอนไปยังคอนโซล
System.out.println( "From: " + then + " to: " + today );
System.out.println( output );
From: 2010-09-27 ถึง: 2019-06-04
8 วันที่แล้ว
8 เดือนที่แล้ว
8 ปีที่แล้ว
java.timeกรอบถูกสร้างขึ้นใน Java 8 และต่อมา ชั้นเรียนเหล่านี้แย่งลำบากเก่ามรดกเรียนวันที่เวลาเช่นjava.util.Date
, และCalendar
SimpleDateFormat
ต้องการเรียนรู้เพิ่มเติมโปรดดูที่ออราเคิลกวดวิชา และค้นหา Stack Overflow สำหรับตัวอย่างและคำอธิบายมากมาย สเปกJSR 310
โครงการJoda-Timeขณะนี้อยู่ในโหมดการบำรุงรักษาแนะนำการโยกย้ายไปยังคลาสjava.time
คุณสามารถแลกเปลี่ยนวัตถุjava.timeโดยตรงกับฐานข้อมูลของคุณ ใช้ไดรเวอร์ JDBC ที่สอดคล้องกับJDBC 4.2หรือใหม่กว่า ไม่ต้องใช้สายไม่จำเป็นต้องมีjava.sql.*
คลาส
จะหาคลาส java.time ได้ที่ไหน?
โครงการThreeTen-Extraขยาย java.time ด้วยคลาสเพิ่มเติม โปรเจ็กต์นี้เป็นพื้นที่พิสูจน์สำหรับการเพิ่ม java.time ในอนาคต คุณอาจพบว่าการเรียนที่มีประโยชน์บางอย่างที่นี่เช่นInterval
, YearWeek
, YearQuarter
และอื่น ๆ อีกมากมาย
หลังจากค้นคว้ามานานฉันพบสิ่งนี้
public class GetTimeLapse {
public static String getlongtoago(long createdAt) {
DateFormat userDateFormat = new SimpleDateFormat("E MMM dd HH:mm:ss Z yyyy");
DateFormat dateFormatNeeded = new SimpleDateFormat("MM/dd/yyyy HH:MM:SS");
Date date = null;
date = new Date(createdAt);
String crdate1 = dateFormatNeeded.format(date);
// Date Calculation
DateFormat dateFormat = new SimpleDateFormat("MM/dd/yyyy HH:mm:ss");
crdate1 = new SimpleDateFormat("MM/dd/yyyy HH:mm:ss").format(date);
// get current date time with Calendar()
Calendar cal = Calendar.getInstance();
String currenttime = dateFormat.format(cal.getTime());
Date CreatedAt = null;
Date current = null;
try {
CreatedAt = dateFormat.parse(crdate1);
current = dateFormat.parse(currenttime);
} catch (java.text.ParseException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
// Get msec from each, and subtract.
long diff = current.getTime() - CreatedAt.getTime();
long diffSeconds = diff / 1000;
long diffMinutes = diff / (60 * 1000) % 60;
long diffHours = diff / (60 * 60 * 1000) % 24;
long diffDays = diff / (24 * 60 * 60 * 1000);
String time = null;
if (diffDays > 0) {
if (diffDays == 1) {
time = diffDays + "day ago ";
} else {
time = diffDays + "days ago ";
}
} else {
if (diffHours > 0) {
if (diffHours == 1) {
time = diffHours + "hr ago";
} else {
time = diffHours + "hrs ago";
}
} else {
if (diffMinutes > 0) {
if (diffMinutes == 1) {
time = diffMinutes + "min ago";
} else {
time = diffMinutes + "mins ago";
}
} else {
if (diffSeconds > 0) {
time = diffSeconds + "secs ago";
}
}
}
}
return time;
}
}
สำหรับ Android เหมือนที่ Ravi กล่าวไว้ แต่เนื่องจากผู้คนจำนวนมากต้องการเพียงแค่คัดลอกและวางสิ่งที่นี่
try {
SimpleDateFormat formatter = new SimpleDateFormat("EEE, dd MMM yyyy HH:mm:ss Z");
Date dt = formatter.parse(date_from_server);
CharSequence output = DateUtils.getRelativeTimeSpanString (dt.getTime());
your_textview.setText(output.toString());
} catch (Exception ex) {
ex.printStackTrace();
your_textview.setText("");
}
คำอธิบายสำหรับคนที่มีเวลามากขึ้น
อดีต ฉันได้รับข้อมูลจากเซิร์ฟเวอร์ในรูปแบบวันพุธที่ 27 มกราคม 2016 09:32:35 GMT [นี่อาจไม่ใช่กรณีของคุณ]
แปลเป็น
รูปแบบ SimpleDateFormat = SimpleDateFormat ใหม่ ("EEE, dd MMM yyyy HH: mm: ss Z");
ฉันจะรู้ได้อย่างไร อ่านเอกสารที่นี่
หลังจากที่ฉันแยกวิเคราะห์แล้วฉันจะได้วันที่ วันนั้นฉันใส่ getRelativeTimeSpanString (โดยที่ฉันไม่มีพารามิเตอร์เพิ่มเติมใด ๆ เป็นค่าเริ่มต้นเป็นนาที)
คุณจะได้รับการยกเว้นถ้าคุณไม่ได้คิดออกString แยกที่ถูกต้องบางอย่างเช่น: ข้อยกเว้นที่ตัวละคร 5 ดูที่อักขระ 5 และแก้ไขสตริงการแยกวิเคราะห์เริ่มต้นของคุณ . คุณอาจได้รับข้อยกเว้นอื่นให้ทำซ้ำขั้นตอนนี้จนกว่าคุณจะมีสูตรที่ถูกต้อง
private const val SECOND_MILLIS = 1
private const val MINUTE_MILLIS = 60 * SECOND_MILLIS
private const val HOUR_MILLIS = 60 * MINUTE_MILLIS
private const val DAY_MILLIS = 24 * HOUR_MILLIS
object TimeAgo {
fun timeAgo(time: Int): String {
val now = TimeUnit.MILLISECONDS.toSeconds(System.currentTimeMillis())
if (time > now || time <= 0) {
return "in the future"
}
val diff = now - time
return when {
diff < MINUTE_MILLIS -> "Just now"
diff < 2 * MINUTE_MILLIS -> "a minute ago"
diff < 60 * MINUTE_MILLIS -> "${diff / MINUTE_MILLIS} minutes ago"
diff < 2 * HOUR_MILLIS -> "an hour ago"
diff < 24 * HOUR_MILLIS -> "${diff / HOUR_MILLIS} hours ago"
diff < 48 * HOUR_MILLIS -> "yesterday"
else -> "${diff / DAY_MILLIS} days ago"
}
}
}
โทร
Val String = timeAgo (unixTimeStamp)
เพื่อรับช่วงเวลาที่ผ่านมาใน Kotlin
นี่คือการใช้งาน Java ของฉัน
public static String relativeDate(Date date){
Date now=new Date();
if(date.before(now)){
int days_passed=(int) TimeUnit.MILLISECONDS.toDays(now.getTime() - date.getTime());
if(days_passed>1)return days_passed+" days ago";
else{
int hours_passed=(int) TimeUnit.MILLISECONDS.toHours(now.getTime() - date.getTime());
if(hours_passed>1)return days_passed+" hours ago";
else{
int minutes_passed=(int) TimeUnit.MILLISECONDS.toMinutes(now.getTime() - date.getTime());
if(minutes_passed>1)return minutes_passed+" minutes ago";
else{
int seconds_passed=(int) TimeUnit.MILLISECONDS.toSeconds(now.getTime() - date.getTime());
return seconds_passed +" seconds ago";
}
}
}
}
else
{
return new SimpleDateFormat("HH:mm:ss MM/dd/yyyy").format(date).toString();
}
}
มันได้ผลสำหรับฉัน
public class TimeDifference {
int years;
int months;
int days;
int hours;
int minutes;
int seconds;
String differenceString;
public TimeDifference(@NonNull Date curdate, @NonNull Date olddate) {
float diff = curdate.getTime() - olddate.getTime();
if (diff >= 0) {
int yearDiff = Math.round((diff / (AppConstant.aLong * AppConstant.aFloat)) >= 1 ? (diff / (AppConstant.aLong * AppConstant.aFloat)) : 0);
if (yearDiff > 0) {
years = yearDiff;
setDifferenceString(years + (years == 1 ? " year" : " years") + " ago");
} else {
int monthDiff = Math.round((diff / AppConstant.aFloat) >= 1 ? (diff / AppConstant.aFloat) : 0);
if (monthDiff > 0) {
if (monthDiff > AppConstant.ELEVEN) {
monthDiff = AppConstant.ELEVEN;
}
months = monthDiff;
setDifferenceString(months + (months == 1 ? " month" : " months") + " ago");
} else {
int dayDiff = Math.round((diff / (AppConstant.bFloat)) >= 1 ? (diff / (AppConstant.bFloat)) : 0);
if (dayDiff > 0) {
days = dayDiff;
if (days == AppConstant.THIRTY) {
days = AppConstant.TWENTYNINE;
}
setDifferenceString(days + (days == 1 ? " day" : " days") + " ago");
} else {
int hourDiff = Math.round((diff / (AppConstant.cFloat)) >= 1 ? (diff / (AppConstant.cFloat)) : 0);
if (hourDiff > 0) {
hours = hourDiff;
setDifferenceString(hours + (hours == 1 ? " hour" : " hours") + " ago");
} else {
int minuteDiff = Math.round((diff / (AppConstant.dFloat)) >= 1 ? (diff / (AppConstant.dFloat)) : 0);
if (minuteDiff > 0) {
minutes = minuteDiff;
setDifferenceString(minutes + (minutes == 1 ? " minute" : " minutes") + " ago");
} else {
int secondDiff = Math.round((diff / (AppConstant.eFloat)) >= 1 ? (diff / (AppConstant.eFloat)) : 0);
if (secondDiff > 0) {
seconds = secondDiff;
} else {
seconds = 1;
}
setDifferenceString(seconds + (seconds == 1 ? " second" : " seconds") + " ago");
}
}
}
}
}
} else {
setDifferenceString("Just now");
}
}
public String getDifferenceString() {
return differenceString;
}
public void setDifferenceString(String differenceString) {
this.differenceString = differenceString;
}
public int getYears() {
return years;
}
public void setYears(int years) {
this.years = years;
}
public int getMonths() {
return months;
}
public void setMonths(int months) {
this.months = months;
}
public int getDays() {
return days;
}
public void setDays(int days) {
this.days = days;
}
public int getHours() {
return hours;
}
public void setHours(int hours) {
this.hours = hours;
}
public int getMinutes() {
return minutes;
}
public void setMinutes(int minutes) {
this.minutes = minutes;
}
public int getSeconds() {
return seconds;
}
public void setSeconds(int seconds) {
this.seconds = seconds;
} }
นี่คือสคริปต์พื้นฐาน ง่ายต่อการปรับแต่ง
ผลลัพธ์: (XXX ชั่วโมงที่ผ่านมา) หรือ (XX วันที่แล้ว / เมื่อวาน / วันนี้)
<span id='hourpost'></span>
,or
<span id='daypost'></span>
<script>
var postTime = new Date('2017/6/9 00:01');
var now = new Date();
var difference = now.getTime() - postTime.getTime();
var minutes = Math.round(difference/60000);
var hours = Math.round(minutes/60);
var days = Math.round(hours/24);
var result;
if (days < 1) {
result = "Today";
} else if (days < 2) {
result = "Yesterday";
} else {
result = days + " Days ago";
}
document.getElementById("hourpost").innerHTML = hours + "Hours Ago" ;
document.getElementById("daypost").innerHTML = result ;
</script>
สำหรับสิ่งนี้ฉันได้ทำJust Now, seconds ago, min ago, hrs ago, days ago, weeks ago, months ago, years ago
ในตัวอย่างนี้คุณสามารถแยกวิเคราะห์วันที่เช่น2018-09-05T06:40:46.183Z
นี้หรืออื่น ๆ เช่นด้านล่าง
เพิ่มค่าด้านล่างในstring.xml
<string name="lbl_justnow">Just Now</string>
<string name="lbl_seconds_ago">seconds ago</string>
<string name="lbl_min_ago">min ago</string>
<string name="lbl_mins_ago">mins ago</string>
<string name="lbl_hr_ago">hr ago</string>
<string name="lbl_hrs_ago">hrs ago</string>
<string name="lbl_day_ago">day ago</string>
<string name="lbl_days_ago">days ago</string>
<string name="lbl_lstweek_ago">last week</string>
<string name="lbl_week_ago">weeks ago</string>
<string name="lbl_onemonth_ago">1 month ago</string>
<string name="lbl_month_ago">months ago</string>
<string name="lbl_oneyear_ago" >last year</string>
<string name="lbl_year_ago" >years ago</string>
ลองโค้ด java ด้านล่าง
public String getFormatDate(String postTime1) {
Calendar cal=Calendar.getInstance();
Date now=cal.getTime();
String disTime="";
try {
Date postTime;
//2018-09-05T06:40:46.183Z
postTime = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS'Z'").parse(postTime1);
long diff=(now.getTime()-postTime.getTime()+18000)/1000;
//for months
Calendar calObj = Calendar.getInstance();
calObj.setTime(postTime);
int m=calObj.get(Calendar.MONTH);
calObj.setTime(now);
SimpleDateFormat monthFormatter = new SimpleDateFormat("MM"); // output month
int mNow = Integer.parseInt(monthFormatter.format(postTime));
diff = diff-19800;
if(diff<15) { //below 15 sec
disTime = getResources().getString(R.string.lbl_justnow);
} else if(diff<60) {
//below 1 min
disTime= diff+" "+getResources().getString(R.string.lbl_seconds_ago);
} else if(diff<3600) {//below 1 hr
// convert min
long temp=diff/60;
if(temp==1) {
disTime= temp + " " +getResources().getString(R.string.lbl_min_ago);
} else {
disTime = temp + " " +getResources().getString(R.string.lbl_mins_ago);
}
} else if(diff<(24*3600)) {// below 1 day
// convert hr
long temp= diff/3600;
System.out.println("hey temp3:"+temp);
if(temp==1) {
disTime = temp + " " +getResources().getString(R.string.lbl_hr_ago);
} else {
disTime = temp + " " +getResources().getString(R.string.lbl_hrs_ago);
}
} else if(diff<(24*3600*7)) {// below week
// convert days
long temp=diff/(3600*24);
if (temp==1) {
// disTime = "\nyesterday";
disTime = temp + " " +getResources().getString(R.string.lbl_day_ago);
} else {
disTime = temp + " " +getResources().getString(R.string.lbl_days_ago);
}
} else if(diff<((24*3600*28))) {// below month
// convert week
long temp=diff/(3600*24*7);
if (temp <= 4) {
if (temp < 1) {
disTime = getResources().getString(R.string.lbl_lstweek_ago);
}else{
disTime = temp + " " + getResources().getString(R.string.lbl_week_ago);
}
} else {
int diffMonth = mNow - m;
Log.e("count : ", String.valueOf(diffMonth));
disTime = diffMonth + " " + getResources().getString(R.string.lbl_month_ago);
}
}else if(diff<((24*3600*365))) {// below year
// convert month
long temp=diff/(3600*24*30);
System.out.println("hey temp2:"+temp);
if (temp <= 12) {
if (temp == 1) {
disTime = getResources().getString(R.string.lbl_onemonth_ago);
}else{
disTime = temp + " " + getResources().getString(R.string.lbl_month_ago);
}
}
}else if(diff>((24*3600*365))) { // above year
// convert year
long temp=diff/(3600*24*30*12);
System.out.println("hey temp8:"+temp);
if (temp == 1) {
disTime = getResources().getString(R.string.lbl_oneyear_ago);
}else{
disTime = temp + " " + getResources().getString(R.string.lbl_year_ago);
}
}
} catch(Exception e) {
e.printStackTrace();
}
return disTime;
}
คุณสามารถใช้ไลบรารีRelativeDateTimeFormatterของ Java ได้มันทำอย่างนั้น:
RelativeDateTimeFormatter fmt = RelativeDateTimeFormatter.getInstance();
fmt.format(1, Direction.NEXT, RelativeUnit.DAYS); // "in 1 day"
fmt.format(3, Direction.NEXT, RelativeUnit.DAYS); // "in 3 days"
fmt.format(3.2, Direction.LAST, RelativeUnit.YEARS); // "3.2 years ago"
fmt.format(Direction.LAST, AbsoluteUnit.SUNDAY); // "last Sunday"
fmt.format(Direction.THIS, AbsoluteUnit.SUNDAY); // "this Sunday"
fmt.format(Direction.NEXT, AbsoluteUnit.SUNDAY); // "next Sunday"
fmt.format(Direction.PLAIN, AbsoluteUnit.SUNDAY); // "Sunday"
fmt.format(Direction.LAST, AbsoluteUnit.DAY); // "yesterday"
fmt.format(Direction.THIS, AbsoluteUnit.DAY); // "today"
fmt.format(Direction.NEXT, AbsoluteUnit.DAY); // "tomorrow"
fmt.format(Direction.PLAIN, AbsoluteUnit.NOW); // "now"
ฉันใช้ Instant, Date และ DateTimeUtils ข้อมูล (วันที่) ที่เก็บไว้ในฐานข้อมูลประเภท String แล้วแปลงเป็น Instant
/*
This method is to display ago.
Example: 3 minutes ago.
I already implement the latest which is including the Instant.
Convert from String to Instant and then parse to Date.
*/
public String convertTimeToAgo(String dataDate) {
//Initialize
String conversionTime = null;
String suffix = "Yang Lalu";
Date pastTime;
//Parse from String (which is stored as Instant.now().toString()
//And then convert to become Date
Instant instant = Instant.parse(dataDate);
pastTime = DateTimeUtils.toDate(instant);
//Today date
Date nowTime = new Date();
long dateDiff = nowTime.getTime() - pastTime.getTime();
long second = TimeUnit.MILLISECONDS.toSeconds(dateDiff);
long minute = TimeUnit.MILLISECONDS.toMinutes(dateDiff);
long hour = TimeUnit.MILLISECONDS.toHours(dateDiff);
long day = TimeUnit.MILLISECONDS.toDays(dateDiff);
if (second < 60) {
conversionTime = second + " Saat " + suffix;
} else if (minute < 60) {
conversionTime = minute + " Minit " + suffix;
} else if (hour < 24) {
conversionTime = hour + " Jam " + suffix;
} else if (day >= 7) {
if (day > 30) {
conversionTime = (day / 30) + " Bulan " + suffix;
} else if (day > 360) {
conversionTime = (day / 360) + " Tahun " + suffix;
} else {
conversionTime = (day / 7) + " Minggu " + suffix;
}
} else if (day < 7) {
conversionTime = day + " Hari " + suffix;
}
return conversionTime;
}
โซลูชันต่อไปนี้เป็นภาษา Java ล้วน:
ฟังก์ชันต่อไปนี้จะแสดงเฉพาะที่เก็บเวลาที่ใหญ่ที่สุดตัวอย่างเช่นหากเวลาที่ผ่านไปที่แท้จริงคือ"1 month 14 days ago"
ฟังก์ชันนี้จะแสดง"1 month ago"
ขึ้นเท่านั้น ฟังก์ชันนี้จะปัดเศษลงเสมอดังนั้นเวลาที่เทียบเท่า"50 days ago"
จะแสดงเป็น"1 month"
public String formatTimeAgo(long millis) {
String[] ids = new String[]{"second","minute","hour","day","month","year"};
long seconds = millis / 1000;
long minutes = seconds / 60;
long hours = minutes / 60;
long days = hours / 24;
long months = days / 30;
long years = months / 12;
ArrayList<Long> times = new ArrayList<>(Arrays.asList(years, months, days, hours, minutes, seconds));
for(int i = 0; i < times.size(); i++) {
if(times.get(i) != 0) {
long value = times.get(i).intValue();
return value + " " + ids[ids.length - 1 - i] + (value == 1 ? "" : "s") + " ago";
}
}
return "0 seconds ago";
}
เพียงห่อเวลาที่คุณต้องการปัดเศษด้วยคำสั่ง Math.round (... ) ดังนั้นหากคุณต้องการปัดเศษ50 days
ให้2 months
แก้ไขlong months = days / 30
เป็นlong months = Math.round(days / 30.0)
นี่คือกรณีทดสอบของฉันหวังว่าจะช่วยได้:
val currentCalendar = Calendar.getInstance()
currentCalendar.set(2019, 6, 2, 5, 31, 0)
val targetCalendar = Calendar.getInstance()
targetCalendar.set(2019, 6, 2, 5, 30, 0)
val diffTs = currentCalendar.timeInMillis - targetCalendar.timeInMillis
val diffMins = TimeUnit.MILLISECONDS.toMinutes(diffTs)
val diffHours = TimeUnit.MILLISECONDS.toHours(diffTs)
val diffDays = TimeUnit.MILLISECONDS.toDays(diffTs)
val diffWeeks = TimeUnit.MILLISECONDS.toDays(diffTs) / 7
val diffMonths = TimeUnit.MILLISECONDS.toDays(diffTs) / 30
val diffYears = TimeUnit.MILLISECONDS.toDays(diffTs) / 365
val newTs = when {
diffYears >= 1 -> "Years $diffYears"
diffMonths >= 1 -> "Months $diffMonths"
diffWeeks >= 1 -> "Weeks $diffWeeks"
diffDays >= 1 -> "Days $diffDays"
diffHours >= 1 -> "Hours $diffHours"
diffMins >= 1 -> "Mins $diffMins"
else -> "now"
}
Calendar
คลาสที่น่ากลัวถูกแทนที่เมื่อหลายปีก่อนโดยคลาสjava.timeสมัยใหม่ด้วยการนำJSR 310มาใช้ คำแนะนำที่ไม่ดีในปี 2019
var
val
getrelativeDateTimeฟังก์ชั่นที่จะทำให้คุณวันเวลาตามที่คุณเห็นในการแจ้งเตือน Whatsapp
หากต้องการรับวันที่เวลาสัมพัทธ์ในอนาคตให้เพิ่มเงื่อนไข สิ่งนี้สร้างขึ้นโดยเฉพาะสำหรับการรับวันที่เวลาเช่นการแจ้งเตือน Whatsapp
private static String getRelativeDateTime(long date) {
SimpleDateFormat DateFormat = new SimpleDateFormat("MMM dd, yyyy", Locale.getDefault());
SimpleDateFormat TimeFormat = new SimpleDateFormat(" hh:mm a", Locale.getDefault());
long now = Calendar.getInstance().getTimeInMillis();
long startOfDay = StartOfDay(Calendar.getInstance().getTime());
String Day = "";
String Time = "";
long millSecInADay = 86400000;
long oneHour = millSecInADay / 24;
long differenceFromNow = now - date;
if (date > startOfDay) {
if (differenceFromNow < (oneHour)) {
int minute = (int) (differenceFromNow / (60000));
if (minute == 0) {
int sec = (int) differenceFromNow / 1000;
if (sec == 0) {
Time = "Just Now";
} else if (sec == 1) {
Time = sec + " second ago";
} else {
Time = sec + " seconds ago";
}
} else if (minute == 1) {
Time = minute + " minute ago";
} else if (minute < 60) {
Time = minute + " minutes ago";
}
} else {
Day = "Today, ";
}
} else if (date > (startOfDay - millSecInADay)) {
Day = "Yesterday, ";
} else if (date > (startOfDay - millSecInADay * 7)) {
int days = (int) (differenceFromNow / millSecInADay);
Day = days + " Days ago, ";
} else {
Day = DateFormat.format(date);
}
if (Time.isEmpty()) {
Time = TimeFormat.format(date);
}
return Day + Time;
}
public static long StartOfDay(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.getTimeInMillis();
}
SimpleDateFormat
และCalendar
แม้ว่า ชั้นเรียนเหล่านี้ได้รับการออกแบบมาไม่ดีและล้าสมัยไปนาน แทนที่จะอ่านคำตอบที่ใช้ java.time ซึ่งเป็นวันที่และเวลาของ Java API ที่ทันสมัย
สำหรับการขาดความเรียบง่ายและการตอบสนองที่อัปเดตให้ทำตาม Java 8 และเวอร์ชันที่ใหม่กว่า
import java.time.*;
import java.time.temporal.*;
public class Time {
public static void main(String[] args) {
System.out.println(LocalTime.now().minus(8, ChronoUnit.MINUTES));
System.out.println(LocalTime.now().minus(8, ChronoUnit.HOURS));
System.out.println(LocalDateTime.now().minus(8, ChronoUnit.DAYS));
System.out.println(LocalDateTime.now().minus(8, ChronoUnit.MONTHS));
}
}
นี่คือเวอร์ชันที่ใช้ Java Time API ที่พยายามแก้ไขปัญหาในอดีตเพื่อจัดการกับวันที่และเวลา
javadoc
รุ่น 8 https://docs.oracle.com/javase/8/docs/api/index.html?java/time/package-summary.html
รุ่น 11 https://docs.oracle.com/en/java/javase/11/docs/api/java.base/java/time/package-summary.html
บทช่วยสอน W3Schools - https://www.w3schools.com/java/java_date.asp
บทความ DZone - https://dzone.com/articles/java-8-date-and-time