2011-06-22 54 views
6

Tôi đã nhìn xung quanh rất nhiều và viết một đoạn mã khủng khiếp để thao tác chuỗi, tôi muốn hỏi xem có ai biết cách tốt để phân loại nó không:Ngày giờ vấn đề khi ngày <= 12

tôi có một loạt các chuỗi ngày trong các tế bào mà tôi kéo ra như:

03/05/2011
27/05/2011
31/05/2011
03/05/2011
09/05/2011
31/05/2011
vv

Trong khi tôi đang đọc bất kỳ sự hấp dẫn nào trong ngày có thể được hiểu là một tháng - tức là các mục 1, 4 và 5 ở trên - nó được đặt làm DateTime với ngày và tháng được đổi chỗ.

Ví dụ: 03/05/2011 được đọc dưới dạng DateTime "05/03/2011 00:00:00" Những người khác đều đọc và cung cấp cho tôi một chuỗi đơn giản là "27/05/2011 ".

tôi nhận được thông tin này từ Excel, sử dụng

((Excel.Range)worksheet.Cells[rowCount, 3]).Value.ToString() 

Nếu tôi cố gắng Value2 như với các dòng khác của tôi, nó đọc những ngày lẻ như những thứ như "40.607" nhưng một lần nữa, sẽ đọc ngày khác bình thường.

+0

Bạn đang sử dụng văn hóa/miền địa phương nào? – Skurmedel

+0

@Skurmedel: en-GB (yêu cầu của tôi về những ngày như 27/05/2011 nên cho rằng đi) nhưng nó không hoàn toàn có vẻ là một vấn đề nội địa hoá. Nó có một hành vi kỳ quặc khi chỉ đọc những ngày mà nó có thể mơ hồ như cách nào quanh ngày và tháng. Tất cả các entires khác được đọc hoàn hảo. – Aidan

Trả lời

8

Nếu bạn sử dụng hàm DateTime.ParseExact để chuyển đổi chuỗi thành đối tượng DateTime, bạn có thể chỉ định định dạng cụ thể được sử dụng theo ngày của bạn (trông giống như "ngày/tháng/năm") mà không phải thực hiện bất kỳ thao tác chuỗi nào.

Ví dụ:

var dateString = "03/05/2011"; 

var format = "dd/MM/yyyy"; 

var date = DateTime.ParseExact(dateString, format, CultureInfo.InvariantCulture); 

Thông tin thêm về ngày tùy chỉnh và định dạng chuỗi thời gian có thể được tìm thấy here.


EDIT: Hãy thử sử dụng các phương pháp DateTime.FromOADate để chuyển đổi các giá trị được trả về bởi các Range.Value2 tài sản cho một đối tượng DateTime, ví dụ một cái gì đó như thế này:

var dateTime = DateTime.FromOADate(((Excel.Range)worksheet.Cells[rowCount, 3]).Value2); 
+0

Tôi đã thử những thứ như vậy. Vấn đề của tôi dường như là ngay lập tức khi đọc giá trị trong ô, nó đọc nó như là một DateTime trong một định dạng không chính xác trước khi tôi thậm chí còn yêu cầu nó. Tuy nhiên, tại sao nó không đọc phần còn lại của các mục như Ngày giờ? Liệu nó có thực sự coi thường chúng trên CultureInfo khi đọc các tế bào? – Aidan

+0

@Aidan Sau đó, nó sẽ làm việc, ParseExact đã được tạo ra cho chính xác tình hình của bạn. –

+0

@ Donut, bạn không cần '/' trong chuỗi định dạng của bạn? –

0

Vấn đề là do ngày của bạn đang được đọc là văn hóa Mỹ hoặc tương tự.

Nếu bạn sử dụng những điều sau đây bạn có thể xác định dạng mà bạn mong đợi ngày của bạn để được: sử dụng

DateTime result; 
if(DateTime.TryParseExact("dd/MM/yyyy", out result)) 
{ 
    // Got an English date 
} 
+1

rất đúng, cảm ơn – Ian

2

DateTime.ParseExact Method chuyển đổi chuỗi đại diện theo quy định của một ngày và thời gian để DateTime của nó tương đương bằng cách sử dụng định dạng cụ thể và thông tin định dạng văn hóa cụ thể.

Định dạng của biểu diễn chuỗi phải khớp chính xác với định dạng được chỉ định.

String dateString = "15/06/2008"; 
String format = "dd/MM/yyyy"; 

DateTime result = 
    DateTime.ParseExact(dateString, format, CultureInfo.InvariantCulture); 
1

Điều đó nghe giống như vấn đề địa phương hóa. Thử đặt ngôn ngữ của bạn một cách ngầm định.Ví dụ trong ứng dụng WPF đó là cái gì đó như:

System.Threading.Thread.CurrentThread.CurrentCulture = 
    new System.Globalization.CultureInfo("en-US"); 
+0

Đặt chủ đề thành ngôn ngữ của tôi cũng không thực hiện thủ thuật. Cảm ơn mặc dù. – Aidan

1

tôi có một loạt các chuỗi ngày trong các tế bào mà tôi kéo ra như:

Không, bạn không. Bạn có kết hợp các chuỗi trông giống như ngàyngày trông giống như chuỗi. Đây là vấn đề về Excel chứ không phải vấn đề C#.

Không chắc chắn nếu bạn đang tạo bảng tính hoặc nếu bạn đang nhận nó từ nơi khác. Nhưng vấn đề là Excel cố gắng phân tích cú pháp văn bản vì nó được nhập vào ô. Trong trường hợp này, nó đang đưa ra một số quyết định sai về những ngày nó tìm thấy.

Nếu bạn nhập ngày như "03/05/2011", Excel sẽ (phân tích không chính xác) phân tích ngày 5 tháng 3 năm 2011 và lưu trữ dưới dạng mã ngày số (40607). Sau đó, nó áp dụng định dạng ngày ngày cho ô (nó sử dụng m/d/yyyy trên máy của tôi).

Nếu bạn nhập ngày như "31/05/2011", Excel không thể phân tích cú pháp dưới dạng ngày tháng và nó lưu trữ dưới dạng văn bản.

Để chứng minh điều này, hãy chọn ô và chuyển đến Chỉnh sửa> Xóa> Định dạng. Tất cả "ngày xấu" sẽ chỉ hiển thị dưới dạng số, tất cả phần còn lại sẽ vẫn trông giống như ngày tháng.

Bạn có một vài lựa chọn:

  1. Fix dữ liệu trước khi nó nhập vào Excel (thêm vào trước tất cả mọi thứ với một 'nên nó tất cả các bước dưới dạng văn bản, hoặc chắc chắn để tạo ra các bảng tính trên một máy tính mà có cài đặt ngày chính xác.)
  2. Không sử dụng .Value.ToString() từ Excel, chỉ cần sử dụng .Text. Điều này sẽ bỏ qua việc phân tích cú pháp xấu mà Excel đã làm và sẽ cung cấp cho bạn giá trị văn bản nhất quán (từ cả hai loại) mà bạn có thể ParseExact với C#, theo các câu trả lời khác.

(2) dễ dàng hơn rất nhiều và nếu bảng tính đã tồn tại, có thể là lựa chọn duy nhất của bạn.

+0

Yup, tôi nghĩ về điều đó cũng như tôi đang tìm kiếm thông qua những người khác có vấn đề tương tự. Sử dụng .Text trả lại cho tôi "########" thay vì những gì được nhập. Tôi nghĩ rằng nó phải là một cái gì đó kỳ lạ mà Excel đã làm, nhưng đối với cuộc sống của tôi tôi dường như không thể làm tròn nó. Tất cả các ô đã được định dạng và đặt thành ngôn ngữ chính xác, nhưng có, đặt chúng thành văn bản sẽ hiển thị các mục nhập kiểu 40607. Tôi không muốn thay đổi định dạng ô trước khi đọc nhưng có vẻ như sẽ không có lựa chọn ... – Aidan

+0

'.Text' nghĩa là trả lại nội dung được hiển thị trong bảng tính (sau khi tất cả định dạng được áp dụng, v.v. Vì vậy, cách duy nhất nó sẽ trả về "######" là nếu cột không đủ rộng để hiển thị định dạng ngày tháng. Có nghĩa là nó hiển thị "#####" trong bảng tính không? Bạn có thể mở rộng cột để nó không? – BradC

+0

Và việc thay đổi định dạng ô sẽ không khắc phục được sự cố. Excel đã phân tích cú pháp các ngày sai, nó hoán đổi các giá trị tháng và ngày. Bạn có thể xác minh điều này bằng cách thay đổi sang định dạng kiểu "ngày 22 tháng 6 năm 2011". – BradC

Các vấn đề liên quan