「夫を成功」へ導く妻の秘訣 座談会

日付の計算や書式変更を行うメソッド群を含んだ日付クラスを書いています。
YYYYMMDD書式の数値で日付を扱うときの型に、ふさわしい名前が思いつきません。
先人の方の案を教えてください。

何をしようとしているかというと...
・内部的にはint型(32ビット)の整数で西暦日付(紀元元年~)を格納し、書式変更したり、年月を進める・差の日数を求めるなどの計算を行う。
・今はint型で持っているが、適切な名前にtypedefしたい。

これまで考えてる内容としては...
・クラス名がDateなので、それは使えない。
・扱う書式に"YYMMDD"や"YYYY/MM/DD"などがあるため、それらと区別のつく名前にしたい。
・和暦は扱わないので、西暦を意味する名前は絞り込みが効かない。
・西暦にしても、実際には西洋はMMDDYYYYの順番やDDMMYYYYの順番があるので、それらは扱えないと示唆する名前にしたい。
・ISO 8601には"YYYYMMDD"と"YYYY-MM-DD"があるので、ISODateという名前は紛らわしい。
・時間部分(時、分、秒)を扱わないので、小数点以下の存在を暗示するDecimalDateは不適切?(他の有名な製品やプログラム言語で、年月日のみの日付型にこのような名前を付けてたら別にOK?)

質問者からの補足コメント

  • たしかに、扱う、が曖昧で意味不明ですね。
    要は、typedefで、intにかわる8桁の整数値で表す日付に対し、違う型の名前を付けたい、という事です。

    No.1の回答に寄せられた補足コメントです。 補足日時:2015/05/30 09:35

このQ&Aに関連する最新のQ&A

A 回答 (3件)

それって、 typedefで名前を付ける効果ってどこほどなのかな、と思います。



typedef, メソッド、クラス というキーワードから、C++での話だとして進めます。


おそらく
Date dt,
dt.SetDate(20150503)
としたときに、20150503 = 2015年5月3日 だということを示したい、ということなのでしょう。

あるいは
dt.dateValue = 20150503 ;
としたときに、 dateValue が「YYYYMMDD_t型」なので、20150503 = 2015年5月3日だ、ということにしたい、ということなのでしょう。


ですが。

typedefは別名付けでしかありません。
dt.SetDate(30052015)
を防ぐには、実行時に判定するしかありません。
総合開発環境だと、入力時に定義情報が表示されるので、YYYYMMDD_t だとわかるかもしれません。
ですが、できたソースを眺めても、コンパイルしても、間違いを発見できません。

また、複数フォーマットに対応とありますが DDMMYYYY に対応させようとしたときに
typdef int DDMMYYYY_t ;
としたところで、
void SetData(YYYYMMDD_t d);
void SetData(DDMMYYYY_t d);
と2つのメソッドを定義することはできません。

// GetDateYYYYMMDDは YYYYMMDD_tを返す
DDMMYYYY_t ddmmyyyy = dt.GetDate()
もエラーにはなりません。

それなら、
SetDateYYYYMMDD
とメソッド名に書式を入れるとか
SetDate(20150503,FORMAT_YYYYMMDD)
などと、フォーマットを指定するとかの方が、効果があるのではないでしょうか。


また
dt.dateValue = 20150503 ;
のような、制御のできない直接設定はprivateにしておいて、外部に公開しないのがよいのでは。
その場合も
YYYYMMDD_t dateValue ;
と型でするよりは
int YYYYMMDD ;
と変数名前で判別できるようにした方が間違いが発見しやすいです。
    • good
    • 2
この回答へのお礼

ありがとうございます。
確かに変数名で示す方がわかりやすいですね。そうします。

お礼日時:2015/06/23 12:53

YYYYMMDD でいいのでは?

    • good
    • 0

先人ではないですが.



「日付の計算や書式変更を行うメソッド群を含んだ日付クラス」で「YYYYMMDD書式の数値で日付を扱うときの型」というのが, 意味がわかりません. 外部表現と内部表現との間の変換を担当するのか, 「内部的に『YYYYMMDD書式の数値』で日付を扱う」のか, はたまたそれら以外のなにかなのか.
この回答への補足あり
    • good
    • 0

このQ&Aに関連する人気のQ&A

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

Qyyyymmddからyyyy/mm/ddへの変換

いつもお世話になっております。
Aと言う変数にはyyyymmddの値が入っていて
Aをyyyy/mm/ddにしてBの変数に入れたい場合の処理がわかりません。
調べたところ、SimpleDateFormatクラスと言うものを使えばよいと言うことが判明しました。
しかし、今まで使ったことがないのでよくわかりません。
変数Aと変数BはどちらもString型です。
ご教授お願い致します。

Aベストアンサー

 こんにちは。

 本当に変数aの中の文字列が厳密にyyyyMMddの形式のなっているのなら、普通に

String b = a.substring(0, 4) + "/" + a.substring(4, 6) + "/" + a.substring(6, 8);

 これでいいと思いますが、いったんDate型にする必要があったり、ちゃんと日付として認識できるか確かめる必要がある場合は、

String a = "20051029";

SimpleDateFormat formatter = (SimpleDateFormat)DateFormat.getDateInstance();
formatter.applyPattern("yyyyMMdd");
try {
  Date date = formatter.parse(a);
  formatter.applyPattern("yyyy/MM/dd");
  String b = formatter.format(date);
  System.out.println(b);
}
catch (ParseException ex) {
  System.out.println("解析失敗");
}

 こんな感じでいいんじゃないでしょうか。

 こんにちは。

 本当に変数aの中の文字列が厳密にyyyyMMddの形式のなっているのなら、普通に

String b = a.substring(0, 4) + "/" + a.substring(4, 6) + "/" + a.substring(6, 8);

 これでいいと思いますが、いったんDate型にする必要があったり、ちゃんと日付として認識できるか確かめる必要がある場合は、

String a = "20051029";

SimpleDateFormat formatter = (SimpleDateFormat)DateFormat.getDateInstance();
formatter.applyPattern("yyyyMMdd");
try {
  Date date = formatter.p...続きを読む

QInner join と Left joinの明確な違いは?

Inner join と Left joinの違いがよくわかりません。
教えてください。

Aベストアンサー

出てくる結果が違います。

テーブル1のフィールド1に、






が、

テーブル2のフィールド1に、






が入力されている場合、

SELECT [テーブル1].[フィールド1], [テーブル2].[フィールド1]
FROM テーブル1 LEFT JOIN テーブル2 ON [テーブル1].[フィールド1]=[テーブル2].[フィールド1];
では、結果は、
テーブル1.フィールド1 テーブル2.フィールド1
1               1
2               2
3               3
4               NULL
5               NULL
6               NULL
の6レコードが出力されますが、

SELECT [テーブル1].[フィールド1], [テーブル2].[フィールド1]
FROM テーブル1 INNER JOIN テーブル2 ON [テーブル1].[フィールド1]=[テーブル2].[フィールド1];
では、結果は、
テーブル1.フィールド1 テーブル2.フィールド1
1               1
2               2
3               3
の3レコードしか出力されません。

出てくる結果が違います。

テーブル1のフィールド1に、






が、

テーブル2のフィールド1に、






が入力されている場合、

SELECT [テーブル1].[フィールド1], [テーブル2].[フィールド1]
FROM テーブル1 LEFT JOIN テーブル2 ON [テーブル1].[フィールド1]=[テーブル2].[フィールド1];
では、結果は、
テーブル1.フィールド1 テーブル2.フィールド1
1               1
2               2
3           ...続きを読む

Qsedの置換文字に変数を使用したいのですが・・・

あるファイルの特定の文字を変換し、上書きをする処理を行いたいのですが、sedの置換文字に変数が渡せなくて困っています。

例:
X="a"
Y="b"
echo test.txt | sed 's/${X}/${Y/g}' >test.txt

sedでは置換文字に${X}といった変数を使用することはできないのでしょうか?

Aベストアンサー

' ・・・' で囲まれた中の$はそのままドルマークです。変数展開をするなら、'・・・'で囲んではいけません。

何も囲まないか、"・・・"で囲むかです。

Qpingでポートの指定

pingでIPアドレスを指定して、通信できるかどうかというのは
よく使いますが、pingでポートを指定して応答するかどうかは調べられるのでしょうか?

よろしくお願いします

Aベストアンサー

pingを含むICMPというプロトコルは、OSIの7レイヤで言うところのL2(同一セグメント内通信)とL3(IPルーティングされた通信)の両方にまたがる、ちょっと珍しいプロトコルです。

IPアドレスは指定できますが、別サブネットに属するIPアドレスに到達できればL3通信、できなければゲートウェイと呼ばれる同一サブネットに属する中継装置からの回答を得るという点でL2(MAC通信ではなく、同一セグメント内通信という意味)通信です。

ポート番号はL4で使用されるアドレスですから、L4機能の疎通確認はping(を含むICMP)ではできません。

FTPの疎通確認であれば、クライアントからサーバに対するTCP/21通信(FTP-CMD)が可能であること(サーバからクライアントへのTCP/21からの応答を含む)+サーバからクライアントに対するTCP/20通信(FTP-DATA)が可能であること(クライアントからサーバへのTCP/21からの応答を含む)が必要でしょう。

監視ソフトによるものであれば、
・クライアントからサーバへのログイン(TCP/21)
・クライアントからサーバへのlsの結果(TCP/20)
で確認すればよいでしょう。

pingを含むICMPというプロトコルは、OSIの7レイヤで言うところのL2(同一セグメント内通信)とL3(IPルーティングされた通信)の両方にまたがる、ちょっと珍しいプロトコルです。

IPアドレスは指定できますが、別サブネットに属するIPアドレスに到達できればL3通信、できなければゲートウェイと呼ばれる同一サブネットに属する中継装置からの回答を得るという点でL2(MAC通信ではなく、同一セグメント内通信という意味)通信です。

ポート番号はL4で使用されるアドレスですから、L4機能の疎通確認はping(を含む...続きを読む

QRange("A1")⇔cells(1,1)の変換。

EXCELのマクロについて質問します。
Range("A1")⇒(1,1)
cells(1,1)⇒("A1")
に一発変換する方法を教えて下さい。
時間があるかた宜しくお願いします。

Aベストアンサー

こんなのでよろしいでしょうか?
range("A1") → Range("A1").Row & "," & Range("A1").Column
cells(1,1) → Cells(1, 1).Address(False, False)
()や""は付けていません

QGROUP BYを行った後に結合したい。

oracle8iを使用しています。
2つのテーブルを結合したいと思っていますが、
テーブル構成が、N対Nのテーブルのため、
片方をグループ化したあとに結合させようと思っています。

ところが、単純にGroup byを使うと、結合した後に
グループ化してしまうために、期待した値がひょうじされません。

なんとか、1回のSQLで正しく情報をとることはできないものでしょうか。

Aベストアンサー

>テーブル構成が、N対Nのテーブルのため、
>片方をグループ化したあとに結合させようと思っています。

多分こんな形ではどうですか?

SELECT A.KEY,B.KEY,
FROM TABLE_A A
,(SELECT KEY FROM TABLE_B
GROUP BY KEY) B
WHERE A.KEY=B.KEY;

要はFROM句にテーブル名ではなく、SELECT~GROUP BYを書く。

Q"一括"って英語では?

今、英訳をしているのですがPCでよく使う
「一括変換」「一括置換」「一括登録」などの
「一括」をなんと訳していいかがわからず困っています。
言い回しをご存知の方いらっしゃいましたらぜひアドバイスください。
よろしくお願いいたします。

Aベストアンサー

PC 用語としては batch または bulk がよく使用されます。
batch は一度にまとめて、というニュアンス
bulk は一度に大量で、というニュアンス

例: 一括登録(bulk registration)
http://www.100best-free-web-space.com/glossary322.html

参考URL:http://www.100best-free-web-space.com/glossary322.html

Qconfiguration と setting (IT関係)

コンピュータ用語として、configurationとsettingという似たような意味の単語が使われますが(client machine configuration/setting, initial configuration/settingなど)、このふたつの差異が理解できません。
同じことを指すのにどちらの表現も使われていたり、"configuration settings"という用法があったり。
使い分けに厳密な線引きがあるわけではないのは承知していますが、それぞれの単語の持つイメージをつかみたいと思います。
できれば用例を挙げて、「"configuration"はこんな感じ、"setting"はこんな感じ」と説明していただけないでしょうか。

Aベストアンサー

今、アルクの英辞郎を引いてみたら分かり易い解説がありました

<sequence が直線状の配列を表すのに対して、configuration はもっと複雑な相対的な配置をいう。最近ではコンピュータ用語で、ユーザーに合わせた機器やソフトの「設定状況」という意味で使われる>

このようにconfigurationはハードウェアやネットワークの構成/配置、 プログラミングの構成(オブジェクト指向の場合など)など、構造的な設計/設定から、所謂アプリケーションソフトウェアの設定まで広い範囲で使えるのに対して、settingは単なるパラメータの変更など日本語でいうところの「設定」の意味でしか使えない、と私は理解しています。

だから、例えばワープロソフトの表示設定や書式設定をconfigurationというのは大袈裟な気がするし、逆に(ソフト、ハードも含めた)大規模ネットワーク構築の根幹に関わるような「設定」をsettingというのは誤解を招くような気がします。

settingは、ハード/ソフトをある状態にセットすること

configurationは、全体の構成/構造を念頭に置いた上で、ハード/ソフト(の一部または全体)をある状態にセットすること

ということでどうでしょうか?

今、アルクの英辞郎を引いてみたら分かり易い解説がありました

<sequence が直線状の配列を表すのに対して、configuration はもっと複雑な相対的な配置をいう。最近ではコンピュータ用語で、ユーザーに合わせた機器やソフトの「設定状況」という意味で使われる>

このようにconfigurationはハードウェアやネットワークの構成/配置、 プログラミングの構成(オブジェクト指向の場合など)など、構造的な設計/設定から、所謂アプリケーションソフトウェアの設定まで広い範囲で使えるのに対して、settingは...続きを読む

QIOException ってどういうときに起こるのでしょうか?

IOException ってどういうときに起こるのでしょうか?

http://www.atmarkit.co.jp/fjava/rensai2/javaent12/javaent12.html
を見て勉強しています。

  catch ( IOException e) {
    System.out.println( "キーボードが故障しているのかもしれません" );
  }

と書いてあります。
ハード(キーボード)が故障しているのを Java のプログラムのレベル(ソフトウェア)で感知できるというのがよくわかりません。「

NumberFormatException の方はわかるのですが・・・

Aベストアンサー

現実的には、キーボードからの入力でIOExceptionが発生することは、
ほとんどあり得ないと思います。
そもそも、キーボードが故障していたとしても、
IOExceptionは投げられないでしょう。
「キーボードが故障しているのかもしれません」というのは、
その記事の著者が冗談で書いたのだと思います。

ではなぜ、try-catchを書かなくてはいけないのか?
InputStreamやBufferedReaderは、
データ入力を抽象化したものだからです。
実際の入力元はキーボードだったり、ファイルだったり、
ネットワーク接続だったりするわけですけど、
InputStreamは、その入力元の情報を持っていないので、
データを読み取る際は常に
IOExceptionをキャッチするコードを書かなくてはいけません。
たとえ、絶対にIOエラーが発生しないストリームだとしても。

さらに付け加えるなら、
そもそも「標準入力=キーボード」であるとは限りません。
(一般的にはキーボードであることが多いですが。)
Javaでは、
System.setIn(InputStream)
を呼び出して、標準入力を変えてしまうことができますし、
標準入力を指定してプログラムを実行することができるOSもあります。

追伸1:
例外をキャッチしたときは、
スタックトレースをプリントすることをおすすめします。
catch (IOException e) {
e.printStackTrace();
}

追伸2:
そのプログラムでIOExceptionを発生させる最も簡単な方法は、
readLine()を呼び出す前に
標準入力(System.in)を閉じてしまうことです。
System.in.close();

現実的には、キーボードからの入力でIOExceptionが発生することは、
ほとんどあり得ないと思います。
そもそも、キーボードが故障していたとしても、
IOExceptionは投げられないでしょう。
「キーボードが故障しているのかもしれません」というのは、
その記事の著者が冗談で書いたのだと思います。

ではなぜ、try-catchを書かなくてはいけないのか?
InputStreamやBufferedReaderは、
データ入力を抽象化したものだからです。
実際の入力元はキーボードだったり、ファイルだったり、
ネットワーク接...続きを読む

Q文字列として"(ダブルコーテーション)を表示させる方法

こんにちは。文字列として、ダブルコーテーションを表示させるには、どうすればよいのか教えてください。m(__)m


例えば、
<font size="2">あいうえお</font>

というタグの「あいうえお」の部分が、セルA1にあった場合、

="<font size="2">"&A1&"</font>"という表示にしたいのです。

"2"のダブルコーテーションも文字列として表示させるには、どうすればよろしいのでしょうか。

教えてください。よろしくお願い致します。

Aベストアンサー

こんにちは~

表示形式は 「標準」 のままで、
ダブルコーテーションを、ダブルコーテーションで囲んでください。

""2""

="<font size=""2"">"&A1&"</font>"

としてみてください。


人気Q&Aランキング