11
votes

Convertir C # .NET DateTime.Ticks aux jours / heures / mins en JavaScript

Dans mon système, je stocke une durée dans les tiques, qui est transmise à la demande de mon client mobile et de là, je souhaite convertir des ticks en une forme lisible par l'homme. Dans mon cas, jours, heures et minutes.

My Client Mobile Application est codé à l'aide de JavaScript, et c'est donc ce que j'utilise pour convertir la durée en jours / heures / minutes.


0 commentaires

5 Réponses :


10
votes

en C # .NET, une seule tique représente cent nanosecondes ou un dix-million d'une seconde. [Source] .

Par conséquent, afin de calculer le nombre de jours à partir du nombre de tiques (arrondi aux numéros entiers les plus proches), j'ai d'abord calculer le nombre de secondes en multipliant par dix millions, puis multipliez cela par le nombre de secondes dans un Jour (60 secondes en minutes, 60 minutes à l'heure, 24 heures sur 24). J'utilise l'opérateur de modulus (%) pour obtenir les valeurs restantes qui représentent la durée des heures et des minutes. P>

var time = 3669905128; // Time value in ticks
var days = Math.floor(time/(24*60*60*10000000)); // Math.floor() rounds a number downwards to the nearest whole integer, which in this case is the value representing the day
var hours = Math.round((time/(60*60*10000000)) % 24); // Math.round() rounds the number up or down
var mins = Math.round((time/(60*10000000)) % 60);

console.log('days: ' + days);   
console.log('hours: ' + hours);   
console.log('mins: ' + mins);


4 commentaires

Veuillez utiliser 10e7 au lieu de 10000000 , voici quelle notation exponentielle est utile!


@Antonijn: C'est tout à fait comportement acceptable .


@ CL4PTR4P D'accord, je n'étais pas au courant de cela, merci d'éclairer moi!


10E7 a 8 zéro d'après 1. 10000000 est en fait 10e6 :)




9
votes
var ticks = 635556672000000000; 

//ticks are in nanotime; convert to microtime
var ticksToMicrotime = ticks / 10000;

//ticks are recorded from 1/1/1; get microtime difference from 1/1/1/ to 1/1/1970
var epochMicrotimeDiff = Math.abs(new Date(0, 0, 1).setFullYear(1));

//new date is ticks, converted to microtime, minus difference from epoch microtime
var tickDate = new Date(ticksToMicrotime - epochMicrotimeDiff);
According to this page the setFullYear method returns "A Number, representing the number of milliseconds between the date object and midnight January 1 1970".Check out this page for all the methods from the javascript Date object.

5 commentaires

J'ai utilisé cette approche pour calculer une date (636874594860000000 tiques), mais je ne sais pas pourquoi en JavaScript, je reçois "mercredi 06 2019 10:12:15 GMT + 0100" quand c'est réellement "{06/03 / 2019 08:58:06} "(Ceci est la valeur renvoyée par une nouvelle dateTime (636874594860000000) dans .NET). Je suis inquiet du retard dans les minutes (bien sûr, la différence entre les heures est normale).


C'est assez étrange. Lorsque j'utilise cette fonction avec les tiques que vous avez spécifiées, je reçois le mercredi 06 2019 09:38:34 GMT + 0100 (heure standard de la mi-Europe) qui est identique à la date d'heure C #. Êtes-vous sûr de recevoir les bonnes tiques? Jsfiddle.net/pkmelee337/gwl5up4j/1


Oui, très, très bizarre ... J'ai exécuté le jsfiddle que tu viens de poster et j'ai toujours la mauvaise date "Wed mars 06 2019 10:12:12:50 GMT + 0100 (Hora Estándar de Europa Central)". Même la valeur que vous obtenez n'est pas la seule ... J'aimerais approfondir cette question, mais je suis vraiment perdu ... où je pouvais commencer à vérifier ce problème?


Hmm cela pourrait avoir à faire quelque chose avec les fuseaux horaires. (Mais toujours la différence en minutes est bizarre) pouvez-vous vérifier celui-ci? jsfiddle.net/pkmelee337/gwl5up4j/3 J'ai ajouté la date.utc () pour vous assurer que La date est créée sur UTC. Je ne sais vraiment pas où commencer autrement.


Ça a marché! Je devais juste passer de 0 à l'année, Fixerural (0), car il affichait la date en 2020 année. Mais au moins, les minutes sont correctes maintenant. Quoi qu'il en soit, une question très étrange liée aux fuseaux horaires ...



3
votes

au côté côté serveur strong>, vous pouvez utiliser une méthode d'extension, comme ceci: xxx pré>

avec ces extensions, vous pouvez obtenir les ticks JavaScript, puis Vous les transmettez simplement au côté client. p>

Si vous utilisez MVC: P>

Vous avez la vueModel: P>

var hours = mydatetime.getHours();
var minutes = mydatetime.getMinutes();
var seconds = mydatetime.getSeconds();


0 commentaires

0
votes

Faisons plus simple, coquille nous? ....

Selon Microsoft: Public Const Long TicksPerday = 864000000000; P>

https://docs.microsoft.com/en-us/dotnet/api/system.timepan.ticksperday?view=net-5.0 p>

private int GetDaysDiff(DateTime fromDate, DateTime toDate)
{
    long ticksPerDay = 864000000000;

    long ticksDiff = Math.Abs(fromDate.Ticks - toDate.Ticks);

    var days = ticksDiff / ticksPerDay;

    return (int)days;
}


0 commentaires