2013-03-18 34 views
8

Nel mio sistema, sto memorizzando una durata in Ticks, che viene passata all'applicazione mobile del mio cliente, e da lì voglio convertire i tick in un forma leggibile dall'uomo. Nel mio caso, giorni, ore e minuti.Converti C# .NET DateTime.ticks in giorni/ore/minuti in JavaScript

La mia applicazione mobile client è codificata utilizzando Javascript, e quindi questo è quello che sto usando per convertire la durata in giorni/ore/minuti.

risposta

9

In C# .NET, un singolo segno di spunta rappresenta un centinaio di nanosecondi o un decimo di milionesimo di secondo. [Source].

Pertanto, per calcolare il numero di giorni dal numero di zecche (arrotondato ai numeri interi più vicini), prima calcolo il numero di secondi moltiplicando per dieci milioni e quindi moltiplicando quello per il numero di secondi in un giorno (60 secondi in minuto, 60 minuti in ora, 24 ore in giorno). Io uso l'operatore modulo (%) per ottenere i valori rimanenti che costituiscono la durata di ore e minuti.

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); 

Quindi, nell'esempio sopra, la quantità di zecche equivale a 6 minuti (arrotondato per eccesso).

E per fare un altro esempio, con 2.193.385.800.000.000 di zecche, otteniamo 2538 giorni, 15 ore e 23 minuti.

+4

si prega di usare '10e7' invece di' 10000000', questo è ciò che la notazione esponenziale è utile per! – antonijn

+1

@Antonijn: Questo è abbastanza [comportamento accettabile] (http://blog.stackoverflow.com/2011/07/its-ok-to-ask-and-answer-your-own-questions/). – MyCodeSucks

+0

@ CL4PTR4P Ok, non ne ero a conoscenza, grazie per avermi illuminato! – antonijn

4

è necessario considerare 2 cose:

Risoluzione
zecche in DateTime di .NET sono 0,1 microsecondi, mentre Javascript conta millisecondi.

Offset
Inoltre, Net conta dal 1.1.0000, mentre JavaScript conta dal 1.1.1970.

TeaFiles.Net ha una classe Time che utilizza i tick di Java = Javascript. Ha una proprietà in scala e una scala Timescale.Java predefinita, che converte da .Net in Javascript.

1
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); 

Secondo this page il metodo setFullYear restituisce "un numero, che rappresenta il numero di millisecondi tra l'oggetto data e la mezzanotte 1 gennaio 1970".

Verificare this page per tutti i metodi dall'oggetto Date javascript.

2

Al lato server, è possibile utilizzare un metodo di estensione, in questo modo:

public static class DateTimeExtensions { 
    private static readonly long UnixEpochTicks = (new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc)).Ticks; 

    public static long? ToJavascriptTicks(this DateTime? value) { 
     return value == null ? (long?)null : (value.Value.ToUniversalTime().Ticks - UnixEpochTicks)/10000; 
    } 
    public static long ToJavascriptTicks(this DateTime value) { 
     return (value.ToUniversalTime().Ticks - UnixEpochTicks)/10000; 
    } 
} 

Con questo estensioni, è possibile ottenere il javascript zecche, e poi semplicemente passare al client- lato.

Se si utilizza MVC:

Hai ViewModel:

public class MyViewModel { 
    public long MyJsTicks { get; set; } 
} 

e il controller:

public ActionResult Action() { 
    long myJsTicks = DateTime.UtcNow.ToJavascriptTicks(); //<-- use the extension method 

    MyViewModel viewModel = new MyViewModel(); 
    viewModel.MyJsTicks = myJsTicks; 

    return View(viewModel); 
} 

Al lato client:

var jsticks = <the js ticks obtained from server-side>; 
var mydatetime = new Date(jsticks); 

Se si utilizza la visualizzazione del motore Razor per la vostra app mobile, ottenendo i js calcolati zecche dal lato server nella vista è estremamente semplice, utilizzando un'espressione in-line:

var jsticks = @(Model.MyJsTicks); 
var mydatetime = new Date(jsticks); 

Infine, per ottenere giorni , ore e minuti dalla oggetto Date javascript:

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

(come si può vedere nel javascript "Data" riferimento all'oggetto: https://www.w3schools.com/jsref/jsref_obj_date.asp)