How can I divide time by using intervals?
like 01:00 divided by 20 mins = 3?
06:00 divided by 2 hours = 3?
/M
I'd just use the TimeSpan object:
int hours = 1;
int minutes = 0;
int seconds = 0;
TimeSpan span = new TimeSpan(hours, minutes, seconds);
double result = span.TotalMinutes / 20; // 3
Don't bother manually doing any conversions, the TimeSpan object with it's TotalHours, TotalMinutes, TotalSeconds properties, etc, do it all for you.
Something like this should work well, I suppose:
public static double SplitTime(TimeSpan input, TimeSpan splitSize)
{
double msInput = input.TotalMilliseconds;
double msSplitSize = splitSize.TotalMilliseconds;
return msInput / msSplitSize;
}
Example; split 1 hour in 20 minute chunks:
double result = SplitTime(new TimeSpan(1,0,0), new TimeSpan(0,20,0));
I guess the method could fairly easily be reworked to return an array of TimeSpan objects containing the different "slices".
First convert everything to seconds.
01:00 => 3600 seconds, 20 mins => 1200 seconds
then you can divide
Convert to minutes and then do the divison.
h - hours
m - minutes
hd - divider hours
md - divider minutes
(h * 60 + m) / (hd * 60 + md)
Related
I have a situation where in I have time strings like
10:20:70
11:65:40
I need to convert them into proper time in hh:mm:ss format using c# console.
For eg : 10:20:70 will be 10:21:10 after fixing
26:12:20 will be 02:12:10 as 26hours to be considered as 2 hours
How to achieve this? Please help me out.
Any help would be appreciated
Split the input and and either use a TimeSpan to get the real representation of the input.
Or use modulo operator % to fix the overflow.
var split = date.Split(":").Select(int.Parse).ToArray();
if(split.Count() != 3) {Console.WriteLine("bad format"); continue;}
/// public TimeSpan (int hours, int minutes, int seconds);
var realTimeSpanRepresentation = new TimeSpan(split[0],split[1],split[2]);
var correctedTimeSpanRepresentation = new TimeSpan(split[0]%24,split[1]%60,split[2]%60);
Console.WriteLine(date+" => "+realTimeSpanRepresentation+" / "+correctedTimeSpanRepresentation);
/// public DateTime (int year, int month, int day, int hour, int minute, int second);
//var realDateTimeRepresentation = new DateTime(1,1,1,split[0],split[1],split[2]); // Will go boom cause overflow
var correctedDateTimeRepresentation = new DateTime(1,1,1,split[0]%24,split[1]%60,split[2]%60);
Console.WriteLine(date+" => "+correctedDateTimeRepresentation);
Result:
10:20:70 => 10:21:10 / 10:20:10
10:20:70 => 01/01/0001 10:20:10
11:65:40 => 12:05:40 / 11:05:40
11:65:40 => 01/01/0001 11:05:40
99:99:99 => 4.04:40:39 / 03:39:39
99:99:99 => 01/01/0001 03:39:39
demo: https://dotnetfiddle.net/Uwb4zc
NB: I nammed it real representation, cause Imo "00:60:00" is one Hour not "00:00:00"
Here is a method that takes a total amount of seconds and gives proper values for how many years, days, hours, minutes and seconds in there.
public static void GetTimeFromSeconds(float secondsTotal, out int s, out int m, out int h, out int d, out int y)
{
s = m = h = d = y = 0;
s = (int)(secondsTotal % 60);
// substruct the seconds remainder from the total amount (75 - 15 = 60, 125 - 5 = 120).
secondsTotal -= s;
// if nothing left then it was less than 1 minute (45 - 0 = 45).
if (secondsTotal < 60)
return;
// secondsTotal / 60 => how many minutes total
// % 60 => how many minutes remain after splitting to whole hours
m = (int)(secondsTotal / 60 % 60);
// substruct the minutes remainder from the total amount (every minute takes 60 secs from the total)
secondsTotal -= m * 60;
// if there's not enough seconds remain in the total to get at least 1 whole hour (3600 secs)
// then it means there was less than 1 hour.
if (secondsTotal < 3600)
return;
// secondsTotal / 3600 => how many hours total
// % 24 => what will remain after splitting to whole days (24 hours)
h = (int)(secondsTotal / 3600 % 24);
// every whole hour takes 3600 secs from the total
secondsTotal -= h * 3600;
// 24 hours = 86400 seconds.
// If there's less remaining than it was less than 24 hours.
if (secondsTotal < 86400)
return;
// secondsTotal/ 86400 => how many days total
// % 365 => how many will remain after splitting to years
d = (int)(secondsTotal / 86400 % 365);
// substruct whole days
secondsTotal -= d * 86400;
// 1 year = 31536000 secs.
// is there enough secs remaining to get a whole year?
if (secondsTotal < 31536000)
return;
y = (int)(secondsTotal / 31536000);
}
So, you could parse your time into separate values
26:70:20 => hours=26, minutes=70, seconds=20
then count the total amount of seconds:
secondsTotal = hours * 3600 + minutes * 60 + seconds
and then use the method above:
int years, days, hours, mins, secs;
GetTimeFromSeconds(secondsTotal, out secs, out mins, out hours, out days, out years);
For 26 hours, 70 mins, 20 secs the results will be days: 1, hours: 3, minutes: 10, secs: 20.
Then format it into the format you need. For example:
TimeSpan properTime = new TimeSpan(hours, mins, secs);
properTime.ToString(#"hh\:mm\:ss");
I have a code like this:
private IEnumerator RunTimer(float time, int kind_of_function)
{
var seconds = (int) time;
while (time > 0)
{
yield return null;
time -= Time.deltaTime;
if ((int) time != seconds)
{
// Update the text
seconds = (int) time;
timerText.text = string.Format("{0:00}:{1:00}", seconds / 60, seconds % 60);
}
if (seconds == 0)
{
}
}
}
How to change this output format: 0:00 In such a way that if the number of seconds was two-digit then it would look like 00, and if it was one-digit then 0?
As said use one of
#0 where
0 means: I definitely want this digit always
# means: I want this digit only if it is not 0 or is a significant 0
see Custom Numeric Format Strings
D
which basically means: Only show significant decimals digits.
Since you have int you could even also use N which usually includes digits after the comma
see Standard Numeric Format strings
Simply do not define a special format at all.
What you describe is what happens by default anyway if you simply used
string.Format("{0}:{1}", seconds / 60, seconds % 60)
Then I would prefer $ string interpolation which in my opinion is more flexible and better maintainable
timeText.text = $"{seconds / 60}:{seconds % 60}";
or with the formatter
timeText.text = $"{seconds / 60:#0}:{seconds % 60:#0}";
Though in my humble opinion you should stick to what you had. Doesn't it look way better?
Okey apparently what you actually wanted is not displaying the minutes at all if there are only seconds
var minutes = seconds / 60;
if(minutes > 0)
{
timeText.text = $"{minutes}:{seconds % 60:#0}";
}
else
{
timeText.text = $"{seconds:#0}";
}
private IEnumerator RunTimer(float time)
{
var seconds = (int) time;
while (time > 0)
{
yield return null;
time -= Time.deltaTime;
bool moreThanTenSec = time / 10 > 1;
if ((int) time != seconds)
{
// Update the text
seconds = (int) time;
if (moreThanTenSec)
timerText.text = string.Format("{0:00}:{1:00}", seconds / 60, seconds % 60);
else
timerText.text = string.Format("{0:00}:{1:0}", seconds / 60, seconds % 60);
}
if (seconds == 0)
{
}
}
I'm having a task for school in C#. I'm having this issue with the following code (example)
static void Main()
{
do
{
Console.Write("Amount of centimeters?: ");
double centimeters = double.Parse(Console.ReadLine());
double meters = centimeters / 100;
Console.WriteLine($"Amount of meters: {meters}");
int wholeMeters = (int)meters;
Console.WriteLine($"Amount of whole meters: {wholeMeters}");
}while (true);
}
Result:
Amount of centimeters?: 350
Amount of meters: 3,5
Amount of whole meters: 3
Amount of centimeters?: 50
Amount of meters: 0,5
Amount of whole meters: 0
If the result gives 0 for "Amount of whole meters", I don't want to show the line "Amount of whole meters:" in the console.
Like this:
Amount of centimeters?: 50
Amount of meters: 0,5
How can I achieve that, only using the 'System' namespace?
You will pretty sure learn about control structures in the very near future.
Just check the value of your wholeMeters field and act on the result
if(wholeMeters != 0)
Console.WriteLine($"Amount of whole meters: {wholeMeters}");
Actually this was my exercise, and I found the result by going true the code again step by step (Took me 1 day !!! :) )
static void Main()
{
do
{
Console.Write("Timespan in seconds?: ");
int timeInSeconds;
if (int.TryParse(Console.ReadLine(), out timeInSeconds))
{
Console.WriteLine("This is:");
double amountOfDays = timeInSeconds / 86400;
if (amountOfDays != 0)
Console.WriteLine($"- {(int)amountOfDays} days");
double amountOfHours = timeInSeconds / 3600 - ((int)amountOfDays * 24);
if (amountOfHours != 0)
Console.WriteLine($"- {(int)amountOfHours} hours");
double amountOfMinuts = timeInSeconds / 60 - ((int)amountOfHours * 60) - ((int)amountOfDays * 24 * 60);
if (amountOfMinuts != 0)
Console.WriteLine($"- {(int)amountOfMinuts} minuts");
double amountOfSeconds = timeInSeconds - ((int)amountOfMinuts * 60) - ((int)amountOfHours * 60 * 60) - ((int)amountOfDays * 24 * 60 * 60);
if (amountOfSeconds != 0)
Console.WriteLine($"- {(int)amountOfSeconds} seconds");
}
else
{
Console.WriteLine("Please enter a positive integer!");
}
} while (true);
}
}
Timespan in seconds?: 34567788
This is:
400 days
2 hours
9 minuts
48 seconds
Timespan in seconds?: 34567
This is:
9 hours
36 minuts
7 seconds Timespan in seconds?: 2345 This is:
39 minuts
5 seconds
Timespan in seconds?: 45
This is:
45 seconds
Timespan in seconds?: twenty
Please enter a positive integer!
I knew I had to use the if statement, but I had my (double) variables declared at the start of the code instead of right before each calculation.
Thanks for the help anyway!
Okay first off, I'm pretty sure I'm not expected to use TimeSpan for this assignment; rather a formula series which shows the seconds, minutes, and hours in a message box when the user enters the number of seconds in the text box.
Here's where I'm stuck. We're supposed to check our answers with the example: 7565 seconds is 2 hours, 6 minutes, and 5 seconds. However, my code ends up calculating it as 2 hours, 6 minutes, and 6 seconds. It also keeps that answer when the initial number is 7560 seconds. I'm so confused!! It's a conditional scenario, in which the message box shows only the seconds if the user enters under 60 seconds, only minutes + seconds if the user enters between 60 and 3600 seconds, and hours + minutes + seconds if over 3600 seconds is entered. Here is what I have so far, and I'd appreciate any insight as to why my calculation is off :)
Thanks for the answers! But the 7565 isn't a constant; the user can enter any amount of seconds but my professor used 7565 as an example to check if we're on the right track.
private void calculateButton1_Click(object sender, EventArgs e)
{
int totalSeconds, hours, minutes, minutesRemainder, hoursRemainderMinutes, hoursRemainderSeconds;
totalSeconds = int.Parse(secondsTextBox1.Text);
minutes = totalSeconds / 60;
minutesRemainder = totalSeconds % 60;
hours = minutes / 60;
hoursRemainderMinutes = minutes % 60;
hoursRemainderSeconds = hoursRemainderMinutes % 60;
if (totalSeconds < 60)
{
MessageBox.Show(totalSeconds.ToString());
}
else if (totalSeconds < 3600)
{
MessageBox.Show(minutes.ToString() + " minutes, " + minutesRemainder.ToString() + " seconds");
}
else if (totalSeconds>3600)
{
MessageBox.Show(hours.ToString() + " hours, " + hoursRemainderMinutes.ToString() + " minutes, " + hoursRemainderSeconds.ToString() + " seconds");
}
}
Try using modular arithmetics
int totalSeconds = 7565;
int hours = totalSeconds / 3600;
int minutes = (totalSeconds % 3600) / 60;
int seconds = (totalSeconds % 60);
...
if (hours > 0)
MessageBox.Show(String.Format("{0} hours, {1} minutes, {2} seconds", hours, minutes, seconds));
else if (minutes > 0)
MessageBox.Show(String.Format("{0} minutes, {1} seconds", minutes, seconds));
else
MessageBox.Show(String.Format("{0} seconds", seconds));
This is my code:
IdleTime = System.Environment.TickCount - LastInput.dwTime;
int hour = ((IdleTime + 500) / 86400000);
int min = ((IdleTime + 500) / 60000) - (hour * 60);
int sec = ((IdleTime + 500) / 1000) - (min * 60);
I got a idle timer for this in a timer that tracks the idle time
The seconds works and the min works but im not sure if it will work once the hour hits 24 I think it might bug out on me coz 86400000 millie milliseconds is a day and I have the sec and the min getting data from the previous time like sec is gettings data from the min. Can anyone help?
I recommend that you work with the TimeSpan type to avoid doing the math yourself:
int milliseconds = Environment.TickCount - LastInput.dwTime;
TimeSpan idleTime = TimeSpan.FromMilliseconds(milliseconds + 500);
int hour = (int) idleTime.TotalHours;
int minutes = idleTime.Minutes;
int seconds = idleTime.Seconds;
I would say
IdleTime = System.Environment.TickCount - LastInput.dwTime;
int hours = IdleTime / 3600000;
int minutes = IdleTime / 60000 - hour * 60;
int seconds = IdleTime / 1000 - min * 60;
I'm not sure why you substract 500 from IdleTime.