Namespaces
Variants

asctime, asctime_s

From cppreference.net
ヘッダーで定義 <time.h>
(1)
char * asctime ( const struct tm * time_ptr ) ;
(C23まで)
[ [ deprecated ] ] char * asctime ( const struct tm * time_ptr ) ;
(C23から)
errno_t asctime_s ( char * buf, rsize_t bufsz, const struct tm * time_ptr ) ;
(2) (C11から)
1) 指定された暦時刻 tm を以下の固定25文字形式のテキスト表現に変換する: Www Mmm dd hh : mm : ss yyyy\n
  • Www - time_ptr - > tm_wday から取得した3文字の英語略記曜日( Mon Tue Wed Thu Fri Sat Sun のいずれか)
  • Mmm - time_ptr - > tm_mon から取得した3文字の英語略記月名( Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec のいずれか)
  • dd - timeptr - > tm_mday から取得した2桁の日付( sprintf % 2d を使用して出力した場合と同様)
  • hh - timeptr - > tm_hour から取得した2桁の時間( sprintf % .2d を使用して出力した場合と同様)
  • mm - timeptr - > tm_min から取得した2桁の分( sprintf % .2d を使用して出力した場合と同様)
  • ss - timeptr - > tm_sec から取得した2桁の秒( sprintf % .2d を使用して出力した場合と同様)
  • yyyy - timeptr - > tm_year + 1900 から取得した4桁の年( sprintf % 4d を使用して出力した場合と同様)
* time_ptr のいずれかのメンバーがその正常範囲外にある場合、動作は未定義です。
動作は未定義である、もしカレンダー年が time_ptr - > tm_year によって示される年が4桁を超えるか、1000年より小さい場合。
この関数はローカライズをサポートしておらず、改行文字を削除することはできません。
この関数は静的ストレージを変更し、スレッドセーフではありません。
この関数は非推奨であり、新しいコードでは使用すべきではありません。
(since C23)
2) (1) と同様であるが、メッセージはユーザー提供のストレージ buf に書き込まれ、これはnull終端が保証される。また、以下のエラーが実行時に検出され、現在インストールされている constraint handler 関数を呼び出す:
  • buf または time_ptr がnullポインタである
  • bufsz が26未満または RSIZE_MAX を超えている
  • * time_ptr のすべてのメンバーが正常範囲内にない
  • time_ptr - > tm_year で示される年が0未満または9999を超えている
すべての境界チェック付き関数と同様に、 asctime_s は、実装によって __STDC_LIB_EXT1__ が定義され、かつユーザーが <time.h> をインクルードする前に __STDC_WANT_LIB_EXT1__ を整数定数 1 に定義した場合にのみ利用可能であることが保証される。

目次

パラメータ

time_ptr - 時間を指定する tm オブジェクトへのポインタ
buf - 少なくとも26バイトの長さを持つユーザー提供バッファへのポインタ
bufsz - ユーザー提供バッファのサイズ

戻り値

1) 上記で説明されている日付と時刻の文字列表現を保持する、静的でヌル終端された文字列へのポインタ。この文字列は asctime ctime の間で共有される可能性があり、これらの関数のいずれかが呼び出されるたびに上書きされる可能性があります。
2) 成功時はゼロ、失敗時は非ゼロを返し、その場合 buf [ 0 ] はゼロに設定される(ただし buf がヌルポインタの場合、または bufsz がゼロまたは RSIZE_MAX より大きい場合を除く)。

注記

asctime は静的データへのポインタを返し、スレッドセーフではありません。POSIXはこの関数を廃止予定とマークし、代わりに strftime の使用を推奨しています。C標準も asctime および asctime_s の代わりに strftime を推奨しています。これは strftime がより柔軟でロケール対応であるためです。

POSIXは未定義動作を、出力文字列が25文字を超える場合、 timeptr - > tm_wday または timeptr - > tm_mon が期待される範囲内にない場合、あるいは timeptr - > tm_year INT_MAX - 1990 を超える場合にのみ限定しています。

一部の実装では timeptr - > tm_mday == 0 を前月の最終日を意味するものとして扱います。

#define __STDC_WANT_LIB_EXT1__ 1
#include <stdio.h>
#include <time.h>
int main(void)
{
    struct tm tm = *localtime(&(time_t){time(NULL)});
    printf("%s", asctime(&tm)); // note implicit trailing '\n'
#ifdef __STDC_LIB_EXT1__
    char str[26];
    asctime_s(str, sizeof str, &tm);
    printf("%s", str);
#endif
}

出力例:

Tue May 26 21:51:50 2015
Tue May 26 21:51:50 2015

参考文献

  • C17規格 (ISO/IEC 9899:2018):
  • 7.27.2.1 asctime関数 (p: 287)
  • K.3.8.2.1 asctime_s関数 (p: 453-454)
  • C11標準 (ISO/IEC 9899:2011):
  • 7.27.2.1 asctime関数 (p: 392-393)
  • K.3.8.2.1 asctime_s関数 (p: 624-625)
  • C99規格 (ISO/IEC 9899:1999):
  • 7.23.3.1 asctime関数 (p: 341-342)
  • C89/C90標準 (ISO/IEC 9899:1990):
  • 4.12.3.1 asctime関数

関連項目

(C23で非推奨) (C11)
time_t オブジェクトをテキスト表現に変換する
(関数)
tm オブジェクトをカスタムテキスト表現に変換する
(関数)