ฉันต้องการแปลงจำนวนมิลลิวินาทีโดยพลการเป็นวันชั่วโมงนาทีวินาที
ตัวอย่างเช่น 10 วัน 5 ชั่วโมง 13 นาที 1 วินาที
ฉันต้องการแปลงจำนวนมิลลิวินาทีโดยพลการเป็นวันชั่วโมงนาทีวินาที
ตัวอย่างเช่น 10 วัน 5 ชั่วโมง 13 นาที 1 วินาที
คำตอบ:
เนื่องจากไม่มีใครก้าวขึ้นมาฉันจะเขียนโค้ดง่ายๆเพื่อทำสิ่งนี้:
x = ms / 1000
seconds = x % 60
x /= 60
minutes = x % 60
x /= 60
hours = x % 24
x /= 24
days = x
ฉันแค่ดีใจที่คุณหยุดอยู่กับวันและไม่ถามถึงเดือน :)
โปรดทราบว่าในข้างต้นถือว่าเป็นการ/
ตัดทอนการหารจำนวนเต็ม หากคุณใช้รหัสนี้ในภาษาที่/
แสดงถึงการหารทศนิยมคุณจะต้องตัดทอนผลลัพธ์ของการหารด้วยตนเองตามต้องการ
ให้ A เป็นจำนวนมิลลิวินาที จากนั้นคุณมี:
seconds=(A/1000)%60
minutes=(A/(1000*60))%60
hours=(A/(1000*60*60))%24
และอื่น ๆ ( %
เป็นตัวดำเนินการโมดูลัส)
หวังว่านี่จะช่วยได้
/
แบ่งจุดลอยตัวคุณจะต้องตัดทอนค่า สันนิษฐานในคำตอบอื่น ๆ ที่/
ดำเนินการหารจำนวนเต็ม
วิธีแก้ปัญหาทั้งสองด้านล่างใช้จาวาสคริปต์ (ฉันไม่รู้ว่าวิธีแก้ปัญหาคือไม่เข้าใจเรื่องภาษา!) โซลูชันทั้งสองจะต้องขยายออกไปหากจับระยะเวลาได้> 1 month
ได้
var date = new Date(536643021);
var str = '';
str += date.getUTCDate()-1 + " days, ";
str += date.getUTCHours() + " hours, ";
str += date.getUTCMinutes() + " minutes, ";
str += date.getUTCSeconds() + " seconds, ";
str += date.getUTCMilliseconds() + " millis";
console.log(str);
ให้:
"6 days, 5 hours, 4 minutes, 3 seconds, 21 millis"
ห้องสมุดมีประโยชน์ แต่ทำไมต้องใช้ห้องสมุดในเมื่อคุณสามารถประดิษฐ์วงล้อขึ้นมาใหม่ได้! :)
var getDuration = function(millis){
var dur = {};
var units = [
{label:"millis", mod:1000},
{label:"seconds", mod:60},
{label:"minutes", mod:60},
{label:"hours", mod:24},
{label:"days", mod:31}
];
// calculate the individual unit values...
units.forEach(function(u){
millis = (millis - (dur[u.label] = (millis % u.mod))) / u.mod;
});
// convert object to a string representation...
var nonZero = function(u){ return dur[u.label]; };
dur.toString = function(){
return units
.reverse()
.filter(nonZero)
.map(function(u){
return dur[u.label] + " " + (dur[u.label]==1?u.label.slice(0,-1):u.label);
})
.join(', ');
};
return dur;
};
สร้างออบเจ็กต์ "ระยะเวลา" ด้วยฟิลด์ใดก็ได้ที่คุณต้องการ การจัดรูปแบบการประทับเวลากลายเป็นเรื่องง่าย ...
console.log(getDuration(536643021).toString());
ให้:
"6 days, 5 hours, 4 minutes, 3 seconds, 21 millis"
return dur[u.label] + " " + (dur[u.label]==1?u.label.slice(0,-1):u.label);
var nonZero = function(u){ return !u.startsWith("0"); }; // convert object to a string representation... dur.toString = function(){ return units.reverse().map(function(u){ return dur[u.label] + " " + (dur[u.label]==1?u.label.slice(0,-1):u.label); }).filter(nonZero).join(', '); };
Apache คอมมอนส์แลงมีDurationFormatUtilsว่ามีวิธีการที่เป็นประโยชน์มากเช่นformatDurationWords
คุณควรใช้ฟังก์ชันวันที่และเวลาของภาษาใด ๆ ที่คุณใช้ แต่เพื่อความสนุกสนานนี่คือรหัส:
int milliseconds = someNumber;
int seconds = milliseconds / 1000;
int minutes = seconds / 60;
seconds %= 60;
int hours = minutes / 60;
minutes %= 60;
int days = hours / 24;
hours %= 24;
นี่เป็นวิธีที่ฉันเขียน ใช้เวลาinteger milliseconds value
และส่งคืน a human-readable String
:
public String convertMS(int ms) {
int seconds = (int) ((ms / 1000) % 60);
int minutes = (int) (((ms / 1000) / 60) % 60);
int hours = (int) ((((ms / 1000) / 60) / 60) % 24);
String sec, min, hrs;
if(seconds<10) sec="0"+seconds;
else sec= ""+seconds;
if(minutes<10) min="0"+minutes;
else min= ""+minutes;
if(hours<10) hrs="0"+hours;
else hrs= ""+hours;
if(hours == 0) return min+":"+sec;
else return hrs+":"+min+":"+sec;
}
function convertTime(time) {
var millis= time % 1000;
time = parseInt(time/1000);
var seconds = time % 60;
time = parseInt(time/60);
var minutes = time % 60;
time = parseInt(time/60);
var hours = time % 24;
var out = "";
if(hours && hours > 0) out += hours + " " + ((hours == 1)?"hr":"hrs") + " ";
if(minutes && minutes > 0) out += minutes + " " + ((minutes == 1)?"min":"mins") + " ";
if(seconds && seconds > 0) out += seconds + " " + ((seconds == 1)?"sec":"secs") + " ";
if(millis&& millis> 0) out += millis+ " " + ((millis== 1)?"msec":"msecs") + " ";
return out.trim();
}
ฉันขอแนะนำให้ใช้ฟังก์ชันวันที่ / เวลา / ไลบรารีที่ภาษา / กรอบงานที่คุณเลือกให้ ตรวจสอบฟังก์ชันการจัดรูปแบบสตริงเนื่องจากมักมีวิธีง่ายๆในการส่งวันที่ / เวลาประทับและส่งออกรูปแบบสตริงที่มนุษย์อ่านได้
ทางเลือกของคุณง่ายมาก:
Long serverUptimeSeconds =
(System.currentTimeMillis() - SINCE_TIME_IN_MILLISECONDS) / 1000;
String serverUptimeText =
String.format("%d days %d hours %d minutes %d seconds",
serverUptimeSeconds / 86400,
( serverUptimeSeconds % 86400) / 3600 ,
((serverUptimeSeconds % 86400) % 3600 ) / 60,
((serverUptimeSeconds % 86400) % 3600 ) % 60
);
Long expireTime = 69l;
Long tempParam = 0l;
Long seconds = math.mod(expireTime, 60);
tempParam = expireTime - seconds;
expireTime = tempParam/60;
Long minutes = math.mod(expireTime, 60);
tempParam = expireTime - minutes;
expireTime = expireTime/60;
Long hours = math.mod(expireTime, 24);
tempParam = expireTime - hours;
expireTime = expireTime/24;
Long days = math.mod(expireTime, 30);
system.debug(days + '.' + hours + ':' + minutes + ':' + seconds);
สิ่งนี้ควรพิมพ์: 0.0: 1: 9
ทำไมไม่ทำสิ่งนี้:
var ms = 86400;
var วินาที = ms / 1,000; //86.4
var นาที = วินาที / 60; //1.4400000000000002
var ชั่วโมง = นาที / 60; //0.024000000000000004
var วัน = ชั่วโมง / 24; //0.0010000000000000002
และจัดการกับ float precision เช่น Number (minutes.toFixed (5)) //1.44
ใน Java
public static String formatMs(long millis) {
long hours = TimeUnit.MILLISECONDS.toHours(millis);
long mins = TimeUnit.MILLISECONDS.toMinutes(millis);
long secs = TimeUnit.MILLISECONDS.toSeconds(millis);
return String.format("%dh %d min, %d sec",
hours,
mins - TimeUnit.HOURS.toMinutes(hours),
secs - TimeUnit.MINUTES.toSeconds(mins)
);
}
ให้สิ่งนี้:
12h 1 min, 34 sec
ฉันไม่สามารถแสดงความคิดเห็นในคำตอบแรกสำหรับคำถามของคุณได้ แต่มีข้อผิดพลาดเล็กน้อย คุณควรใช้ parseInt หรือ Math.floor เพื่อแปลงตัวเลขทศนิยมเป็นจำนวนเต็ม i
var days, hours, minutes, seconds, x;
x = ms / 1000;
seconds = Math.floor(x % 60);
x /= 60;
minutes = Math.floor(x % 60);
x /= 60;
hours = Math.floor(x % 24);
x /= 24;
days = Math.floor(x);
โดยส่วนตัวแล้วฉันใช้ CoffeeScript ในโครงการของฉันและรหัสของฉันดูเหมือนว่า:
getFormattedTime : (ms)->
x = ms / 1000
seconds = Math.floor x % 60
x /= 60
minutes = Math.floor x % 60
x /= 60
hours = Math.floor x % 24
x /= 24
days = Math.floor x
formattedTime = "#{seconds}s"
if minutes then formattedTime = "#{minutes}m " + formattedTime
if hours then formattedTime = "#{hours}h " + formattedTime
formattedTime
นี่คือวิธีแก้ปัญหา หลังจากนั้นคุณสามารถแบ่งตาม ":" และรับค่าของอาร์เรย์
/**
* Converts milliseconds to human readeable language separated by ":"
* Example: 190980000 --> 2:05:3 --> 2days 5hours 3min
*/
function dhm(t){
var cd = 24 * 60 * 60 * 1000,
ch = 60 * 60 * 1000,
d = Math.floor(t / cd),
h = '0' + Math.floor( (t - d * cd) / ch),
m = '0' + Math.round( (t - d * cd - h * ch) / 60000);
return [d, h.substr(-2), m.substr(-2)].join(':');
}
var delay = 190980000;
var fullTime = dhm(delay);
console.log(fullTime);
นี่คือวิธีแก้ปัญหาของฉันโดยใช้ TimeUnit
UPDATE: ฉันควรชี้ให้เห็นว่าสิ่งนี้ถูกเขียนด้วยภาษาที่น่าสนใจ แต่ Java นั้นแทบจะเหมือนกัน
def remainingStr = ""
/* Days */
int days = MILLISECONDS.toDays(remainingTime) as int
remainingStr += (days == 1) ? '1 Day : ' : "${days} Days : "
remainingTime -= DAYS.toMillis(days)
/* Hours */
int hours = MILLISECONDS.toHours(remainingTime) as int
remainingStr += (hours == 1) ? '1 Hour : ' : "${hours} Hours : "
remainingTime -= HOURS.toMillis(hours)
/* Minutes */
int minutes = MILLISECONDS.toMinutes(remainingTime) as int
remainingStr += (minutes == 1) ? '1 Minute : ' : "${minutes} Minutes : "
remainingTime -= MINUTES.toMillis(minutes)
/* Seconds */
int seconds = MILLISECONDS.toSeconds(remainingTime) as int
remainingStr += (seconds == 1) ? '1 Second' : "${seconds} Seconds"
วิธีที่ยืดหยุ่นในการทำ:
(ไม่ได้สร้างขึ้นสำหรับวันที่ปัจจุบัน แต่ดีพอสำหรับระยะเวลา)
/**
convert duration to a ms/sec/min/hour/day/week array
@param {int} msTime : time in milliseconds
@param {bool} fillEmpty(optional) : fill array values even when they are 0.
@param {string[]} suffixes(optional) : add suffixes to returned values.
values are filled with missings '0'
@return {int[]/string[]} : time values from higher to lower(ms) range.
*/
var msToTimeList=function(msTime,fillEmpty,suffixes){
suffixes=(suffixes instanceof Array)?suffixes:[]; //suffixes is optional
var timeSteps=[1000,60,60,24,7]; // time ranges : ms/sec/min/hour/day/week
timeSteps.push(1000000); //add very big time at the end to stop cutting
var result=[];
for(var i=0;(msTime>0||i<1||fillEmpty)&&i<timeSteps.length;i++){
var timerange = msTime%timeSteps[i];
if(typeof(suffixes[i])=="string"){
timerange+=suffixes[i]; // add suffix (converting )
// and fill zeros :
while( i<timeSteps.length-1 &&
timerange.length<((timeSteps[i]-1)+suffixes[i]).length )
timerange="0"+timerange;
}
result.unshift(timerange); // stack time range from higher to lower
msTime = Math.floor(msTime/timeSteps[i]);
}
return result;
};
หมายเหตุ: คุณสามารถตั้งค่าtimeStepsเป็นพารามิเตอร์ได้หากคุณต้องการควบคุมช่วงเวลา
วิธีใช้ (คัดลอกการทดสอบ):
var elsapsed = Math.floor(Math.random()*3000000000);
console.log( "elsapsed (labels) = "+
msToTimeList(elsapsed,false,["ms","sec","min","h","days","weeks"]).join("/") );
console.log( "half hour : "+msToTimeList(elsapsed,true)[3]<30?"first":"second" );
console.log( "elsapsed (classic) = "+
msToTimeList(elsapsed,false,["","","","","",""]).join(" : ") );
ผมขอแนะนำให้ใช้ ห้องสมุดhttp://www.ocpsoft.org/prettytime/ ..
มันง่ายมากที่จะหาช่วงเวลาในรูปแบบที่มนุษย์อ่านได้เช่น
PrettyTime p = new PrettyTime();
System.out.println(p.format(new Date()));
มันจะพิมพ์เหมือน "ช่วงเวลาต่อจากนี้"
ตัวอย่างอื่น ๆ
PrettyTime p = new PrettyTime());
Date d = new Date(System.currentTimeMillis());
d.setHours(d.getHours() - 1);
String ago = p.format(d);
แล้ว string ago = "1 ชั่วโมงที่แล้ว"
นี่คือวิธีการที่แม่นยำยิ่งขึ้นใน JAVA ฉันได้ใช้ตรรกะง่ายๆนี้หวังว่านี่จะช่วยคุณ:
public String getDuration(String _currentTimemilliSecond)
{
long _currentTimeMiles = 1;
int x = 0;
int seconds = 0;
int minutes = 0;
int hours = 0;
int days = 0;
int month = 0;
int year = 0;
try
{
_currentTimeMiles = Long.parseLong(_currentTimemilliSecond);
/** x in seconds **/
x = (int) (_currentTimeMiles / 1000) ;
seconds = x ;
if(seconds >59)
{
minutes = seconds/60 ;
if(minutes > 59)
{
hours = minutes/60;
if(hours > 23)
{
days = hours/24 ;
if(days > 30)
{
month = days/30;
if(month > 11)
{
year = month/12;
Log.d("Year", year);
Log.d("Month", month%12);
Log.d("Days", days % 30);
Log.d("hours ", hours % 24);
Log.d("Minutes ", minutes % 60);
Log.d("Seconds ", seconds % 60);
return "Year "+year + " Month "+month%12 +" Days " +days%30 +" hours "+hours%24 +" Minutes "+minutes %60+" Seconds "+seconds%60;
}
else
{
Log.d("Month", month);
Log.d("Days", days % 30);
Log.d("hours ", hours % 24);
Log.d("Minutes ", minutes % 60);
Log.d("Seconds ", seconds % 60);
return "Month "+month +" Days " +days%30 +" hours "+hours%24 +" Minutes "+minutes %60+" Seconds "+seconds%60;
}
}
else
{
Log.d("Days", days );
Log.d("hours ", hours % 24);
Log.d("Minutes ", minutes % 60);
Log.d("Seconds ", seconds % 60);
return "Days " +days +" hours "+hours%24 +" Minutes "+minutes %60+" Seconds "+seconds%60;
}
}
else
{
Log.d("hours ", hours);
Log.d("Minutes ", minutes % 60);
Log.d("Seconds ", seconds % 60);
return "hours "+hours+" Minutes "+minutes %60+" Seconds "+seconds%60;
}
}
else
{
Log.d("Minutes ", minutes);
Log.d("Seconds ", seconds % 60);
return "Minutes "+minutes +" Seconds "+seconds%60;
}
}
else
{
Log.d("Seconds ", x);
return " Seconds "+seconds;
}
}
catch (Exception e)
{
Log.e(getClass().getName().toString(), e.toString());
}
return "";
}
private Class Log
{
public static void d(String tag , int value)
{
System.out.println("##### [ Debug ] ## "+tag +" :: "+value);
}
}