2016-01-26 21 views
6

Tôi có hai lần trong Ticks như vậy:Làm cách nào để cắt bớt mili giây "Ticks" mà không chuyển đổi thành datetime?

//2016-01-22​T17:34:52.648Z 
var tick1 = 635890808926480754; 

//2016-01-22​T17:34:52.000Z 
var tick2 = 635890808920000000; 

Bây giờ như bạn có thể thấy so sánh hai con số này tick1 == tick2 returns false

mặc dù ngày đều giống nhau (ngoài mili giây).

Tôi muốn cắt ngắn mili giây khi những con số mà không cần chuyển đổi nó vào một datetime (vì điều này sẽ làm giảm hiệu quả)

Tôi đã nhìn Math.Round mà nói:

Làm tròn một giá trị cho số nguyên gần nhất hoặc số chữ số thập phân được chỉ định.

và cũng Math.Truncate tôi cũng không làm những gì tôi cần.

Nhìn vào Datetime.Ticks nó nói:

Một đánh dấu đơn đại diện cho một trăm nano giây hoặc một trong mười phần triệu của một giây. Có 10.000 ve trong một phần nghìn giây hoặc 10 triệu bọ ve trong một giây.

Vì vậy, tôi cần làm tròn số xuống mười triệu gần nhất.

Điều này có khả thi không?

+0

chia cho 10000000f và sử dụng Math.Ceil trên kết quả? – Icepickle

Trả lời

11

Bạn có thể sử dụng phân chia số nguyên:

if (tick1/TimeSpan.TicksPerSecond == tick2/TimeSpan.TicksPerSecond) 

này hoạt động bởi vì nếu bạn chia một long/int bởi một long/int kết quả cũng là một long/int do đó cắt bỏ phần thập phân.

+1

Tôi không chắc tại sao điều này lại được bình chọn.Nếu 'tick1 == tick2 trả về false' thì' tick1/10000000 == tick2/10000000' cũng sẽ trả về false trừ khi bạn cắt ngắn sau khi chia. Đó chỉ là đại số? Hay tôi đang thiếu một cái gì đó? – user1

+2

@ user1 Vì anh ta đang cắt xén. Nếu bạn chia 'long' hoặc' int' thành 'long' hoặc' int' thì kết quả cũng là 'long' hoặc' int' cắt ngắn phần thập phân. –

+2

@scottChamberlain bạn là chính xác. Đến từ một nền tảng toán học, tôi ghét những con số trong khoa học máy tính – user1

-1

Divide nó 1000 như thế này:

Long Seconds = 635890808926480754/1000 

//Seconds = 635890808926480 
+0

Người bỏ phiếu cũng có thể bình luận. Nó sẽ giúp tôi hiểu sai lầm của tôi. –

+0

@ScottChamberlain Tôi không phải là kẻ phản đối. Tôi sẽ không bao giờ downvote mà không biết chắc chắn rằng một câu trả lời là không chính xác – user1

+2

Chia cho 1000 là không đủ. Theo câu trả lời khác (và câu hỏi trong câu hỏi - _ "10 triệu bọ ve trong một giây" _), bạn cần phải làm điều đó bằng 10.000.000. –

6

Bạn có thể sử dụng này:

if(Math.Abs(tick1 - tick2) < TimeSpan.TicksPerSecond) 

nào tránh làm chia rẽ.

Bạn có thể điều chỉnh độ chính xác mà bạn cần với bất kỳ những điều sau đây:

  • TimeSpan.TicksPerDay
  • TimeSpan.TicksPerHour
  • TimeSpan.TicksPerMinute
  • TimeSpan.TicksPerSecond
  • TimeSpan.TicksPerMillisecond
Các vấn đề liên quan