2010-10-05 3 views
0

Я пытаюсь сделать мою строку приятным отформатированным временем, но столбец в базе данных не настроен, поскольку поле даты/времени есть, так или иначе, я могу это сделать?Преобразование поля базы данных в формат времени

Вот мой запрос

Dim query as String = "Select * from openquery (devbook, 'SELECT wb.arrival_time FROM web_bookings wb ')" 

А вот где я преобразовать его

Session("formattime") = DateTime.Parse(drv.Row("arrival_time")).ToString("hh:mm") 

Поле arrival_time имеет только 4 числа в так 1000 так мне нужен способ преобразования его к хороший формат, подобный этому 10:00AM

Я использую VB кстати

Любые идеи?

Благодаря

Джейми

+0

Не уверен, является ли это отношение (я не парень ASP.NET), но вы даже не говоря уже о SQL диалекта, ни языка программирования. –

ответ

2

Как насчет:

string str = "1000";//drv.Row("arrival_time") 
string[] formats = new string[] { "HHmm" }; 
DateTime dt = DateTime.ParseExact(str, formats, 
            System.Globalization.CultureInfo.InvariantCulture, 
            System.Globalization.DateTimeStyles.AdjustToUniversal); 
string strTime = dt.ToShortTimeString(); 

DateTime dte = DateTime.Now; 
IFormatProvider culture = new System.Globalization.CultureInfo("en-GB", true); 

VB.NET

Dim str As String = "1000" 'drv.Row("arrival_time") 
Dim formats As String() = New String() {"HHmm"} 
Dim dt As DateTime = DateTime.ParseExact(str, formats, System.Globalization.CultureInfo.InvariantCulture, System.Globalization.DateTimeStyles.AdjustToUniversal) 
Dim strTime As String = dt.ToShortTimeString() 

Dim dte As DateTime = DateTime.Now 
Dim culture As IFormatProvider = New System.Globalization.CultureInfo("en-GB", True) 

Выходы:

10:00 утра

В качестве альтернативы, если вы планируете использовать это часто, вы можете добавить это как метод расширения.

public static class Extensions 
{ 
    public static string ToTime(this string str) 
    { 
     DateTime dt = DateTime.Now; 
     try 
     { 
      string[] formats = new string[] { "HHmm" }; 
      dt = DateTime.ParseExact(str, formats, 
               System.Globalization.CultureInfo.InvariantCulture, 
               System.Globalization.DateTimeStyles.AdjustToUniversal); 
     } 
     catch 
     { throw new Exception("Invalid data"); } 
     return dt.ToShortTimeString(); 
    } 
} 

--VB.NET--

Public NotInheritable Class Extensions 
    Private Sub New() 
    End Sub 
    <System.Runtime.CompilerServices.Extension> _ 
    Public Shared Function ToTime(str As String) As String 
     Dim dt As DateTime = DateTime.Now 
     Try 
      Dim formats As String() = New String() {"HHmm"} 
      dt = DateTime.ParseExact(str, formats, System.Globalization.CultureInfo.InvariantCulture, System.Globalization.DateTimeStyles.AdjustToUniversal) 
     Catch 
      Throw New Exception("Invalid data") 
     End Try 
     Return dt.ToShortTimeString() 
    End Function 
End Class 

Пример:

string str = "13000";//drv.Row("arrival_time") 
string strTime = str.ToTime(); 

VB.NET

Dim str As String = "13000" 
'drv.Row("arrival_time") 
Dim strTime As String = str.ToTime() 

Все, что плохо в данных, даст вам исключение.

--EDIT--

отлично работает в VB.NET.

alt text

+0

Похоже на получение аргумента не указано для параметра 'Number' of 'Public Function Str (Number As Object) As String' error with this –

+0

@Jamie Taylor: Пожалуйста, ознакомьтесь с моим изменением в ответ на ваш комментарий. –

+0

@KMan Я преобразовал его в VB.net, верхняя часть дает мне ошибку. Строка не была признана действительной DateTime, а нижняя дает мне ошибку. Аргумент не указан для параметра «Номер» из «Открытая функция» (Number As Object) Как String ' –

0

Дата может содержать не только часов и минут. Вам нужно проверить, что находится во время прибытия

+0

Я добавил немного выше, где указано, что находится в поле моего прибытия_time и какой результат я ищу –

+0

- это число int или строка? –

+0

номер является строкой –

0

Я не знаком с синтаксисом VB.NET, но я думаю, что вы можете просто использовать string.Split() по значению времени прибытия, разделить его на часы и минуты, затем конвертируйте это в DateTime.
DateTime.Parse не будет автоматически понимать, что эти 4 числа должны быть часами и минутами.

0

Я предполагаю, что ваше время ввода - это 3 или 4 цифры представления времени в 24-часовом формате, который может иметь ведущее белое пространство. После этого вы можете разобрать его, как это:

Dim i As Int32 
If Int32.TryParse(drv.Row("arrival_time")), NumberStyles.AllowLeadingWhite, CultureInfo.InvariantCulture, i) Then 
    Dim hours As Int32 = i\100 
    Dim minutes As Int32 = i Mod 100 
    Dim ts As new TimeSpan(hours, minutes, 0) 
    Dim dt As DateTime = DateTime.Now.Date + ts 
    Session("formattime") = dt.ToString("hh:mm tt", CultureInfo.InvariantCulture) 
Else 
    ' Handle invalid time 
End If 

DateTime.Parse и друзья не в состоянии разобрать строки времени только одна цифра за час, следовательно, этот подход. Получение AM/PM права непросто, так что делегируется классу DateTime.

+0

Это не ошибка, но она, похоже, не работает, либо она просто дает мне еще часть вывода? –

0

Посмотрите на этот http://blog.stevex.net/parsing-dates-and-times-in-net/

и

http://msdn.microsoft.com/en-US/library/8kb3ddd4.aspx

Если вам нужно двоеточие там, и может гарантировать, что ваше поле DB всегда возвращает строку с 4-х символов вы можете сделайте что-нибудь подобное, чтобы получить время в правильном формате.

string e = "1000"; // from db. 
string t = string.Format("{0}:{1}", e.Substring(0, 2), e.Substring(2, 2)); 
+0

Это работает, как вы говорите, если это 4 числа, к сожалению, есть некоторые с тремя номерами, которые у них отсутствуют, предшествующий 0 есть, так или иначе, я могу добавить это, если есть 3 числа? –

Смежные вопросы