2013-03-14 50 views
5

Tôi có đoạn code sau -Đặt định dạng DateTime

DateTime timeStamp; 

timeStamp = System.Convert.ToDateTime(y.InnerText); 

đâu y.InnerText11/03/2013 11:35:24.

Tuy nhiên điều này là vi phạm tuyên bố nhập của tôi như nó trở thành cơ sở dữ liệu tìm kiếm định dạng -

2013-03-11 11:35:24 

Làm thế nào tôi có thể thiết lập các định dạng của đối tượng DateTime?

+1

datatype của cột cơ sở dữ liệu của bạn là gì, nếu nó là 'DateTime' sau đó tôi đoán bạn đang sử dụng dây nối để tạo truy vấn của bạn. Sử dụng các truy vấn được tham số – Habib

+0

'DateTime' là bất khả tri về định dạng, chỉ khi bạn chuyển đổi thành chuỗi, nó sẽ được bản địa hóa. – Lloyd

+0

Nếu tham số 'field/field' của cơ sở dữ liệu là' datetime type' bạn sẽ ổn. Nó không phải là một ý tưởng tốt để vượt qua ngày như một chuỗi. Về cơ bản Ngày không có định dạng. – Kaf

Trả lời

12

Làm cách nào để đặt định dạng đối tượng DateTime?

Bạn không thể. Giá trị DateTime không có định dạng, bất kỳ giá trị nào lớn hơn int hoặc double đều có giá trị. Khi bạn muốn chuyển đổi chúng thành/từ chuỗi, nơi bạn chỉ định bất kỳ thông tin định dạng nào.

Thay vào đó, bạn nên sử dụng SQL được tham số hóa và tránh chuyển đổi giá trị DateTime trở lại thành chuỗi ở địa điểm đầu tiên. Đây là một thực hành chung tốt nhất - không bao gồm các giá trị trong chuỗi SQL của bạn; SQL tham số có nhiều lợi ích:

  • Nó tránh SQL injection attacks
  • Nó tránh được các vấn đề chuyển đổi như thế này một
  • Nó giữ mã của bạn (SQL) tách rời khỏi dữ liệu của bạn (giá trị tham số)

tôi sẽ cũng đề xuất rằng thay vì sử dụng Convert.ToDateTime, bạn chỉ định định dạng mong đợi của mình khi phân tích cú pháp. Ví dụ:

timeStamp = DateTime.ParseExact(y.InnerText, 
           "dd/MM/yyyy HH:mm:ss", 
           CultureInfo.InvariantCulture); 

Về cơ bản, hai quy tắc tôi cố gắng áp dụng là:

  • Tránh thực hiện bất kỳ chuyển đổi mà bạn không phải. Nếu bạn đảm bảo rằng mọi hệ thống đều sử dụng đúng loại dữ liệu càng nhiều càng tốt, bạn thường không cần thực hiện bất kỳ chuyển đổi nào.
  • Nơi bạn do cần chuyển đổi thành/từ biểu diễn chuỗi, rất rõ ràng về đại diện bạn muốn tiêu thụ/sản xuất. Đối với các giá trị máy có thể đọc được, thường nên sử dụng văn bản bất biến và có thể là định dạng ngày/giờ tùy chỉnh. Đối với các giá trị có thể đọc được của con người, thường nên sử dụng văn hóa của người dùng và định dạng ngày/giờ chuẩn.
+0

Bài tập học tập tuyệt vời! – Ebikeneser

0

bạn có thể sử dụng ToString chuyển đổi để 2013-03-11 11:35:24

DateTime timeStamp; 

timeStamp = System.Convert.ToDateTime(y.InnerText).ToString("yyyy-MM-dd HH:mm:ss"); 
1

nếu bạn đang đi qua datetime cơ sở dữ liệu sql thử với yourdatetime.ToString ("yyyy/MM/dd") định dạng này sẽ hoạt động cho bạn.

và một điều nữa bạn có thể thêm định dạng ngày giờ cho văn hóa Applicaton của mình. do đó, điều này sẽ đối xử với bạn định dạng datetime lúc bạn mong muốn.

using System; 
using System.Globalization; 
using System.Threading; 

namespace test { 
    public static class Program { 
     public static void Main() { 
      CultureInfo culture = (CultureInfo)CultureInfo.CurrentCulture.Clone(); 
      culture.DateTimeFormat.ShortDatePattern = "yyyy/MM/dd HH:mm:ss"; 
      culture.DateTimeFormat.LongTimePattern = ""; 
      Thread.CurrentThread.CurrentCulture = culture; 
      Console.WriteLine(DateTime.Now); 
     } 
    } 
} 
0

Về cơ bản Ngày không có định dạng. Nếu cơ sở dữ liệu parameter/fieldDatetime type, bạn nên giữ nguyên chuyển thành Loại ngày. Nó không phải là một ý tưởng tốt để vượt qua ngày như một chuỗi.

Tuy nhiên, nếu bạn muốn giải quyết vấn đề, thì bạn nên vượt qua Ngày theo số none culture specific date format (ISO8601 hoặc ISO) trong truy vấn được tham số hóa. Nếu không, bạn có thể gặp sự cố với máy chủ cơ sở dữ liệu trong các cài đặt văn hóa khác nhau. Ví dụ: đối với máy chủ sql, an toàn (trong chuyển đổi) để chuyển thời gian ngày theo ISO8601 thành;

'yyyy-mm-ddThh:mi:ss.mmm' //(no spaces) 
0

Và điều gì sẽ xảy ra nếu bạn chỉ ghi đè phương thức ToString() của đối tượng DateTime? Bạn sẽ không thể chọn định dạng bạn muốn và mỗi khi nó được sử dụng, nó sẽ được định dạng theo cách bạn muốn mà không bị làm phiền bởi nó.

Đây chỉ là suy nghĩ nên tôi không biết liệu có giải pháp nào tốt hơn hay không.

Sau đó, bạn có thể sử dụng thuộc tính năm, tháng, ngày, để xây dựng nó như bạn muốn. Cái gì như:

public override ToString(){ 
    return this.Year + "-" + this.Month + "-" + this.Day; 
} 

Greetings

+0

Và như vậy bạn không có một 'định dạng' cho đối tượng DateTime, nhưng bạn chỉ cần nói cách thức nó nên làm phương pháp ToString của mình. –

0

tôi sử dụng bước này 1. Chuyển đổi để DateTime. 2. Sử dụng ToString(); chức năng

Ví dụ:

DateTime myDateTime = DateTime.Now; 
string myDateTimeString = myDateTime.ToString("yyyy-mm-dd hh:mm:ss"); 
Các vấn đề liên quan