🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

SQL Server

SQL Serverはマイクロソフトのリレーショナルデータベース管理システムです。データマイニングや多次元解析など、ビジネスインテリジェンスのための機能が備わっています。

ASP.NET

ASP.NETは動的なWebサイトやWebアプリケーション、そしてWebサービスを構築出来るようにする為、Microsoftによって開発されたウェブアプリケーション開発フレームワークです。

Q&A

解決済

2回答

3135閲覧

SQL Server C# 「09:00」のように時と分のみを表示させたい(秒は不要)

退会済みユーザー

退会済みユーザー

総合スコア0

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

SQL Server

SQL Serverはマイクロソフトのリレーショナルデータベース管理システムです。データマイニングや多次元解析など、ビジネスインテリジェンスのための機能が備わっています。

ASP.NET

ASP.NETは動的なWebサイトやWebアプリケーション、そしてWebサービスを構築出来るようにする為、Microsoftによって開発されたウェブアプリケーション開発フレームワークです。

0グッド

0クリップ

投稿2021/03/04 07:55

編集2021/03/04 08:58

SQL Serverの値をC#で取得して、WEB上にGridViewで表示しようとしています。
開発はVisual Studio2019、環境はASP.NET Web Forms で行っています。

テーブルには時刻を表す列があり、データ型はtime(7)としています。
その列の値をWEBで表示する際、「09:00」のように時と分のみを表示させたいのですが、「09:00:00」と秒の部分まで表示されてしまいます。
デフォルトの状態から、DataFormatStringの設定(GridViewタスク → 列の編集 → Boundfieldプロパティ → DataFormatString)を {0:t} にしてみましたが、「09:00:00」のまま変化はありませんでした。

つまらないところでひっかかっていそうでお恥ずかしいのですが、有識者の方のお知恵を拝借できれば幸いです。
どうぞよろしくお願いいたします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2021/03/04 08:14

コメントありがとうございます。 "hh:mm"だと、そのままWEB上にも「hh:mm」とアルファベットで文字列が表記されてしまうのです。
BluOxy

2021/03/04 08:25 編集

{0:HH:mm}といった風に{0}に対して適用したらどうでしょうか。 もしくはコロンが2つになってしまうので、{0:HH\\:mm}といった風に書式指定子に含まれるコロンはエスケープする必要があるかもしれません。
退会済みユーザー

退会済みユーザー

2021/03/04 08:26

コメント本当にありがとうございます。 {0:HH:mm} も {0:HH\\:mm} も、「入力文字列の形式が正しくありません。」とエラーになってしまいました。
BluOxy

2021/03/04 08:51

環境はASP.NET Web Formsで合っているでしょうか。合っているのであれば、質問のタグに載せておくとそのジャンルに詳しいユーザから回答がもらえるかもしれません。 --- var now = DateTime.Now; Console.WriteLine("{0:t}",now); Console.WriteLine("{0:HH}",now); Console.WriteLine("{0:HHmm}",now); Console.WriteLine("{0:HH:mm}",now); Console.WriteLine("{0:HH\\:mm}",now); と書いたコードの内、下記2行はどちらも17:45と出たのを確認したのでうまくいくと思いましたが、実際にBoundfieldに入れて試しているわけではないので、何かその環境特有の対処が必要なのかもしれません。
退会済みユーザー

退会済みユーザー

2021/03/04 08:55

重ね重ねご助言ありがとうございます。 はい、ASP.NET Web Forms です。質問タグを追加してみます。 他のプロパティ項目と関連しているのかもしれませんね。
BluOxy

2021/03/04 11:24 編集

aspxファイルで書式を指定している場合はradianさんが紹介したURLにあるHTMLエンコードの有無が関係ありそうな気がします
退会済みユーザー

退会済みユーザー

2021/03/04 11:34

radian様、BluOxy様 コメントありがとうございます。 ご提示のサイトは確認しており、HtmlEncodeも"False"にしています。 ご提示のサイトのようにソースに直接下記のように記載してみたのですが、「入力文字列の形式が正しくありません。 」とエラーが出てしまうのです。 ({0:HH:mm} も {0:HH\\:mm} もエラーになることを確認済み)  <asp:BoundField DataField="starttime" HeaderText="予定開始時間" SortExpression="starttime" HtmlEncode="False" DataFormatString="{0:HH:mm}" /> ■エラー内容 '/' アプリケーションでサーバー エラーが発生しました。 入力文字列の形式が正しくありません。 説明: 現在の Web 要求を実行中に、ハンドルされていない例外が発生しました。エラーに関する詳細および例外の発生場所については、スタック トレースを参照してください。 例外の詳細: System.FormatException: 入力文字列の形式が正しくありません。 ソース エラー: 現在の Web 要求の実行中にハンドルされていない例外が生成されました。 ■エラー内容(ここまで)
退会済みユーザー

退会済みユーザー

2021/03/04 11:36

自分で調べたことを、質問に追記しておいた方がいいと思います。 既知の情報だと、二度手間になってしまうので。
BluOxy

2021/03/04 11:40

ちなみにHHmmだと通りますか。
退会済みユーザー

退会済みユーザー

2021/03/04 11:55

ソースに直接「DataFormatString="{0:hh\:mm}“」と書くことで解決できました。 ( {0:HH:mm}、{0:HH\\:mm}、HHmm はエラーになることを確認済み。私の知識不足でした。) お忙しいところご助言いただきありがとうございました。
guest

回答2

0

ベストアンサー

DateTime 型ではなくて TimeSpan 型で取得されているような気がします(気がするだけで確証はないです)。TimeSpan 型は DateTime 型とは書式設定が異なります。これを試してみてはいかがですか?

カスタム TimeSpan 書式指定文字列
https://docs.microsoft.com/ja-jp/dotnet/standard/base-types/custom-timespan-format-strings

【追記】

var time = new TimeSpan(6, 14, 32, 17, 685); Console.WriteLine("{0:hh\:mm}", time); // 結果: 14:32

【追記2】

下のコメント欄で「TimeSpan 型で間違いなければ、間違いなく期待通りに表示されるはずです。後で回答欄にどのようにするかを追記しておきます」と書いた件です。

C# の文字列と違って、.aspx では DataFormatString="{0:hh:mm}" で \ はエスケープ不要なのに注意。

.aspx.cs

using System; using System.Data; namespace WebApplication1 { public partial class WebForm20 : System.Web.UI.Page { protected void Page_Load(object sender, EventArgs e) { if (!IsPostBack) { GridView1.DataSource = CreateDataTable(); GridView1.DataBind(); } } protected DataTable CreateDataTable() { var table = new DataTable(); table.Columns.Add(new DataColumn("id", typeof(int))); table.Columns.Add(new DataColumn("name", typeof(string))); table.Columns.Add(new DataColumn("time", typeof(TimeSpan))); for (int i = 0; i < 5; i++) { var row = table.NewRow(); row["id"] = i; row["name"] = "name-" + i; row["time"] = new TimeSpan(6, 14, i, 17, 685); table.Rows.Add(row); } return table; } } }

.aspx

<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="WebForm20.aspx.cs" Inherits="WebApplication1.WebForm20" %> <!DOCTYPE html> <html xmlns="http://www.w3.org/1999/xhtml"> <head runat="server"> <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/> <title></title> </head> <body> <form id="form1" runat="server"> <div> <asp:GridView ID="GridView1" runat="server" AutoGenerateColumns="False"> <Columns> <asp:BoundField DataField="id" HeaderText="id" /> <asp:BoundField DataField="name" HeaderText="name" /> <asp:BoundField DataField="time" HeaderText="time" DataFormatString="{0:hh\:mm}" /> </Columns> </asp:GridView> </div> </form> </body> </html>

結果

イメージ説明

【追記3】

下のコメント欄で「ソースに直接書かなくてもデザイン画面で設定できますし、その方がスペルミスも少なくなるのでお勧めです。後で画像を回答欄に貼っておきます」と書いた件です。

イメージ説明

投稿2021/03/04 09:35

編集2021/03/04 12:06
退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2021/03/04 11:01

コメントありがとうございます。 文法的にはご提示いただいたものが正しいことを私も確認していますが、GridViewタスクのDataFormatStringの設定欄に入れると「入力文字列の形式が正しくありません。」のエラーとなってしまうのです。
退会済みユーザー

退会済みユーザー

2021/03/04 11:07

TimeSpan 型であることは確認したのですか?
退会済みユーザー

退会済みユーザー

2021/03/04 11:27

SQLServer での該当項目のデータ型は time(7)にしています。 SQLServer の time 型は、.NET Framework の TimeSpan 型にマッピングされる。よって、TimeSpan 型です。 これで回答になっておりますでしょうか(SQLServer も.NET Frameworkも初心者なもので申し訳ありません)。
退会済みユーザー

退会済みユーザー

2021/03/04 11:38

TimeSpan 型で間違いなければ、間違いなく期待通りに表示されるはずです。後で回答欄にどのようにするかを追記しておきます。
退会済みユーザー

退会済みユーザー

2021/03/04 11:53

ありがとうございます。 DataFormatStringの設定欄ではなく、ソースに直接「DataFormatString="{0:hh\:mm}“」を書き足すことで解決できました。 この度はお忙しいところ本当にありがとうございました。
退会済みユーザー

退会済みユーザー

2021/03/04 12:03

> DataFormatStringの設定欄ではなく、ソースに直接「DataFormatString="{0:hh\:mm}“」を書き足すことで解決できました。 「DataFormatStringの設定欄ではなく」の意味が分かりませんが、ソースに直接書かなくてもデザイン画面で設定できますし、その方がスペルミスも少なくなるのでお勧めです。後で画像を回答欄に貼っておきます。
guest

0

SQL Serverであれば、FORMAT関数でHH:mmに加工するのはいかがでしょうか。
FORMAT (Transact-SQL)

投稿2021/03/04 09:12

退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2021/03/04 11:54

上のほうで回答をたくさんいただいたので、見落としていました。ソースに直接「DataFormatString="{0:hh\:mm}“」と書くことで解決できました。 ご助言ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.36%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問