当前位置:  编程技术>综合
本页文章导读:
    ▪操作系统大型实验进展(4)-----C/C++如何获取系统时间      http://blog.csdn.net/zjnig711/article/details/2419081 c++ 如何获取系统时间   //方案— 优点:仅使用C标准库;缺点:只能精确到秒级 #include <time.h> #include <stdio.h> int main( void ) { time_t .........
    ▪ScheduledExecutorService定时周期执行指定的任务      一:简单说明 ScheduleExecutorService接口中有四个重要的方法,其中scheduleAtFixedRate和scheduleWithFixedDelay在实现定时程序时比较方便。 下面是该接口的原型定义 java.util.concurrent.ScheduleExecutorService exte.........
    ▪学生信息管理      #include <stdio.h> #include <malloc.h> #include <string.h> #define MaxSize 50 #define TRUE 1 #define FALSE 0 typedef int BOOL; typedef struct student { char num[9]; char name[9]; char sex[5]; float score; }student; typedef s.........

[1]操作系统大型实验进展(4)-----C/C++如何获取系统时间
    来源: 互联网  发布时间: 2013-11-10
http://blog.csdn.net/zjnig711/article/details/2419081
c++ 如何获取系统时间
 

//方案— 优点:仅使用C标准库;缺点:只能精确到秒级
#include <time.h>
#include <stdio.h>
int main( void )
{
time_t t = time(0);
char tmp[64];
strftime( tmp, sizeof(tmp), "%Y/%m/%d %X %A 本年第%j天 %z",localtime(&t) );
puts( tmp );
return 0;
}
size_t strftime(char *strDest, size_t maxsize, const char *format, const struct tm *timeptr);
根据格式字符串生成字符串。
struct tm *localtime(const time_t *timer);
取得当地时间,localtime获取的结果由结构tm返回
返回的字符串可以依下列的格式而定:
%a 星期几的缩写。Eg:Tue
%A 星期几的全名。 Eg: Tuesday
%b 月份名称的缩写。
%B 月份名称的全名。
%c 本地端日期时间较佳表示字符串。
%d 用数字表示本月的第几天 (范围为 00 至 31)。日期
%H 用 24 小时制数字表示小时数 (范围为 00 至 23)。
%I 用 12 小时制数字表示小时数 (范围为 01 至 12)。
%j 以数字表示当年度的第几天 (范围为 001 至 366)。
%m 月份的数字 (范围由 1 至 12)。
%M 分钟。
%p 以 ''AM'' 或 ''PM'' 表示本地端时间。
%S 秒数。
%U 数字表示为本年度的第几周,第一个星期由第一个周日开始。
%W 数字表示为本年度的第几周,第一个星期由第一个周一开始。
%w 用数字表示本周的第几天 ( 0 为周日)。
%x 不含时间的日期表示法。
%X 不含日期的时间表示法。 Eg: 15:26:30
%y 二位数字表示年份 (范围由 00 至 99)。
%Y 完整的年份数字表示,即四位数。 Eg:2008
%Z(%z) 时区或名称缩写。Eg:中国标准时间
%% % 字符。

//方案二 优点:能精确到毫秒级;缺点:使用了windows API
#include <windows.h>
#include <stdio.h>
int main( void )
{
SYSTEMTIME sys;
GetLocalTime( &sys );
printf( "%4d/%02d/%02d %02d:%02d:%02d.%03d 星期%1d/n",sys.wYear,sys.wMonth,sys.wDay,sys.wHour,sys.wMinute, sys.wSecond,sys.wMilliseconds,sys.wDayOfWeek);
return 0;
}

//方案三,优点:利用系统函数,还能修改系统时间
//此文件必须是c++文件
#include<stdlib.h>
#include<iostream>
using namespace std;
void main()
{
system("time");
}

//方案四,将当前时间折算为秒级,再通过相应的时间换算即可
//此文件必须是c++文件
#include<iostream>
#include<ctime>
using namespace std;
int main()
{
time_t now_time;
now_time = time(NULL);
cout<<now_time;
return 0;
}

1,时间的获取:
通过time()函数来获得日历时间(Calendar Time),其原型为:time_t time(time_t * timer);
#include "stdafx.h"
#include "time.h"
#include "stdio.h"
#include "stdlib.h"
int main(void)
{
struct tm t;             //定义tm时间结构,用来存储时间格式的数据信息
time_t t_of_day;      //定义time_t时间结构
t.tm_year=2006-1900;//以1900年为标准计算时间
t.tm_mon=6;                  //为结构体成员赋值
t.tm_mday=1;
t.tm_hour=0;
t.tm_min=0;
t.tm_sec=1;
t.tm_isdst=0;
t_of_day=mktime(&t);
// 使用mktime()函数将用tm结构表示的时间转化为日历时间:time_t型变量。其函数原型如下:time_t mktime(struct tm * timeptr);ctime()函数(参数为time_t结构)将时间以固定的格式显示出来,返回值是char*型的字符串。
return 0;
}
2,时间的储存,通过预定义的两种结构来存储:
1,日历时间(Calendar Time)是通过time_t数据类型来表示的,用time_t表示的时间(日历时间)是从一个时间点(例如:1970年1月1日0时0分0秒)到此时的秒数。在time.h中,我们也可以看到time_t是一个长整型数:
#ifndef _TIME_T_DEFINED
typedef long time_t;          /* 时间值 */
#define _TIME_T_DEFINED       /* 避免重复定义 time_t */
#endif
2,在标准C/C++中,我们可通过tm结构来获得日期和时间,tm结构在time.h中的定义如下:
struct tm {
         int tm_sec;      /* 秒 – 取值区间为[0,59] */
         int tm_min;      /* 分 - 取值区间为[0,59] */
         int tm_hour;     /* 时 - 取值区间为[0,23] */
         int tm_mday;     /* 一个月中的日期 - 取值区间为[1,31] */
         int tm_mon;      /* 月份(从一月开始,0代表一月) - 取值区间为[0,11] */
         int tm_year;     /* 年份,其值等于实际年份减去1900 */
         int tm_wday;     /* 星期 – 取值区间为[0,6],其中0代表星期天,1代表星期一,以此类推 */
int tm_yday;     /* 从每年的1月1日开始的天数 – 取值区间为[0,365],其中0代表1月1日,1代表1月2日,以此类推 */
int tm_isdst;    /* 夏令时标识符,实行夏令时的时候,tm_isdst为正。不实行夏令时的进候,tm_isdst为0;不了解情况时,tm_isdst()为负。*/
         };
3,时间的显示:
time.h 头文件中提供了asctime()函数(参数为tm结构指针)和ctime()函数(参数为time_t结构)将时间以固定的格式显示出来,两者的返回值 都是char*型的字符串。返回的时间格式为:星期几 月份 日期 时:分:秒 年/n/0;time.h还提供了两种不同的函数将日历时间(一个用time_t表示的整数)转换为我们平时看到的把年月日时分秒分开显示的时间格式 tm:
struct tm * gmtime(const time_t *timer);
gmtime()函数是将日历时间转化为世界标准时间(即格林尼治时间),并返回一个tm结构体来保存这个时间
struct tm * localtime(const time_t * timer);localtime()函数是将日历时间转化为本地时间
#include <stdafx.h>
#include <time.h>
#include <stdio.h>
#include <stdlib.h>
int main(void)
{
        struct tm *local,*ptr; //定义tm结构指针存储时间信息
time_t t;                        //时间结构或者对象
t=time(NULL);                      //获取当前系统的日历时间
//通过time()函数来获得日历时间(Calendar Time),
//其原型为:time_t time(time_t * timer);
        local=localtime(&t);//localtime()函数是将日历时间转化为本地时间
printf("Local hour is: %d/n",local->tm_hour);//输出tm结构体的时间成员
printf("UTC hour is: %d/n",local->tm_ho
    
[2]ScheduledExecutorService定时周期执行指定的任务
    来源: 互联网  发布时间: 2013-11-10

一:简单说明

ScheduleExecutorService接口中有四个重要的方法,其中scheduleAtFixedRate和scheduleWithFixedDelay在实现定时程序时比较方便。

下面是该接口的原型定义

java.util.concurrent.ScheduleExecutorService extends ExecutorService extends Executor


接口scheduleAtFixedRate原型定义及参数说明

 public ScheduledFuture<?> scheduleAtFixedRate(Runnable command,
				long initialDelay,
				long period,
				TimeUnit unit);

command:执行线程
initialDelay:初始化延时
period:两次开始执行最小间隔时间
unit:计时单位

接口scheduleWithFixedDelay原型定义及参数说明
public ScheduledFuture<?> scheduleWithFixedDelay(Runnable command,
				long initialDelay,
				long delay,
				TimeUnit unit);

command:执行线程
initialDelay:初始化延时
period:前一次执行结束到下一次执行开始的间隔时间(间隔执行延迟时间)
unit:计时单位

二:功能示例

1.按指定频率周期执行某个任务。

初始化延迟0ms开始执行,每隔100ms重新执行一次任务。

/**
 * 以固定周期频率执行任务
 */
public static void executeFixedRate() {
	ScheduledExecutorService executor = Executors.newScheduledThreadPool(1);
	executor.scheduleAtFixedRate(
			new EchoServer(),
			0,
			100,
			TimeUnit.MILLISECONDS);
}
间隔指的是连续两次任务开始执行的间隔。

2.按指定频率间隔执行某个任务。

初始化时延时0ms开始执行,本次执行结束后延迟100ms开始下次执行。

/**
 * 以固定延迟时间进行执行
 * 本次任务执行完成后,需要延迟设定的延迟时间,才会执行新的任务
 */
public static void executeFixedDelay() {
	ScheduledExecutorService executor = Executors.newScheduledThreadPool(1);
	executor.scheduleWithFixedDelay(
			new EchoServer(),
			0,
			100,
			TimeUnit.MILLISECONDS);
}

3.周期定时执行某个任务。

有时候我们希望一个任务被安排在凌晨3点(访问较少时)周期性的执行一个比较耗费资源的任务,可以使用下面方法设定每天在固定时间执行一次任务。

/**
 * 每天晚上8点执行一次
 * 每天定时安排任务进行执行
 */
public static void executeEightAtNightPerDay() {
	ScheduledExecutorService executor = Executors.newScheduledThreadPool(1);
	long oneDay = 24 * 60 * 60 * 1000;
	long initDelay  = getTimeMillis("20:00:00") - System.currentTimeMillis();
	initDelay = initDelay > 0 ? initDelay : oneDay + initDelay;

	executor.scheduleAtFixedRate(
			new EchoServer(),
			initDelay,
			oneDay,
			TimeUnit.MILLISECONDS);
}
/**
 * 获取指定时间对应的毫秒数
 * @param time "HH:mm:ss"
 * @return
 */
private static long getTimeMillis(String time) {
	try {
		DateFormat dateFormat = new SimpleDateFormat("yy-MM-dd HH:mm:ss");
		DateFormat dayFormat = new SimpleDateFormat("yy-MM-dd");
		Date curDate = dateFormat.parse(dayFormat.format(new Date()) + " " + time);
		return curDate.getTime();
	} catch (ParseException e) {
		e.printStackTrace();
	}
	return 0;
}

4.辅助代码

class EchoServer implements Runnable {
	@Override
	public void run() {
		try {
			Thread.sleep(50);
		} catch (InterruptedException e) {
			e.printStackTrace();
		}
		System.out.println("This is a echo server. The current time is " +
				System.currentTimeMillis() + ".");
	}
}

三:一些问题

上面写的内容有不严谨的地方,比如对于scheduleAtFixedRate方法,当我们要执行的任务大于我们指定的执行间隔时会怎么样呢?

对于中文API中的注释,我们可能会被忽悠,认为无论怎么样,它都会按照我们指定的间隔进行执行,其实当执行任务的时间大于我们指定的间隔时间时,它并不会在指定间隔时开辟一个新的线程并发执行这个任务。而是等待该线程执行完毕。

源码注释如下:

* Creates and executes a periodic action that becomes enabled first
* after the given initial delay, and subsequently with the given
* period; that is executions will commence after
* <tt>initialDelay</tt> then <tt>initialDelay+period</tt>, then
* <tt>initialDelay + 2 * period</tt>, and so on.
* If any execution of the task
* encounters an exception, subsequent executions are suppressed.
* Otherwise, the task will only terminate via cancellation or
* termination of the executor.  If any execution of this task
* takes longer than its period, then subsequent executions
* may start late, but will not concurrently execute.
根据注释中的内容,我们需要注意的时,我们需要捕获最上层的异常,防止出现异常中止执行,导致周期性的任务不再执行。

作者:tsyj810883979 发表于2013-1-8 16:28:30 原文链接
阅读:49 评论:0 查看评论

    
[3]学生信息管理
    来源: 互联网  发布时间: 2013-11-10
#include <stdio.h>
#include <malloc.h>
#include <string.h>
#define MaxSize 50
#define TRUE 1
#define FALSE 0
typedef int BOOL;

typedef struct student {
  char num[9];
  char name[9];
  char sex[5];
  float score;
}student;

typedef student T ;

typedef struct {
  int Size;
  int MaxList;
  T Element[MaxSize];
}List;

List* initial() {
    List *lst;
    lst=(List *)malloc(sizeof(List));
    return lst;
}

void CreateList(List *lst, int maxsize) {
   lst->Size = 0;
   lst->MaxList = maxsize;
}

BOOL Append(List *lst,T x)
{
  if(lst->Size > lst->MaxList) {
      printf("Out of Data!");
      return FALSE;
  }
  strcpy(lst->Element[lst->Size].num, x.num);

  strcpy(lst->Element[lst->Size].name, x.name);

  strcpy(lst->Element[lst->Size].sex, x.sex);

  lst->Element[lst->Size].score = x.score;
  lst->Size++;
  return TRUE;
}

BOOL IsFull(List* lst) {
   if(lst->Size==lst->MaxList)
        return TRUE;
   else
        return FALSE;
}
BOOL Insert(List* lst, int pos, T x)
 {
    int i;
   if ( IsFull(lst)){
       printf("Overflow"); return FALSE;
   }
   if ( pos<0 || pos > lst->Size){
       printf("Out of Bounds");
       return FALSE;
    }
   for ( i=lst->Size-1;  i>=pos;  i-- ) {
       lst->Element[i+1] = lst->Element[i];
   }
  strcpy(lst->Element[pos].num, x.num);  //字符;
  strcpy(lst->Element[pos].name, x.name);
  strcpy(lst->Element[pos].sex, x.sex);
  lst->Element[pos].score = x.score;
   lst->Size++;
   return TRUE;
 }

 BOOL Remove(List* lst, int pos) {
    int i;
    if(pos>=0 && pos <= lst->Size-1) {
        for(i = pos; i < lst->Size-1; i++ ) {
            lst->Element[i] = lst->Element[i+1];
        }
        lst->Size = lst->Size -1;
    }
    else {
        printf("要删除的位置不合法!\n");
    }
    return 0;
 }
 BOOL Replace(List* lst, int pos, T x) {
     if(pos >= 0 && pos <= lst->Size) {
        lst->Element[pos] = x;
        printf("替换成功!\n");
     }
     else {
        printf("输入的信息不合法\n");
     }
     return 0;
 }
 void Find(List* lst, int pos) {
    if(pos>=0 && pos <= lst->Size-1) {
        printf("find it!\n");
    }
 }

void output(List *lst, int j) {
    printf("%-10s%-10s%-10s%6f\n",lst->Element[j].num, lst->Element[j].name, lst->Element[j].sex,lst->Element[j].score);
}

 void Loc(List* lst, char *a) {
     int i;
     for(i = 0; i < lst->Size-1; i++) {
        if(!strcmp(lst->Element[i].num , a)) {
            output(lst, i);break;
        }
     }
 }

void Show(List *lst) {
  int i;
  printf("数据表中记录条数为:%d\n",lst->Size);
  printf("____________________________________________________________________\n");
  for(i=0; i < lst->Size; i++) {
      printf("%-10s%-10s%-10s%6f\n",lst->Element[i].num, lst->Element[i].name, lst->Element[i].sex,lst->Element[i].score);
      printf("____________________________________________________________________\n");
  }
}

void input( T*  stemp ) {
    printf("学号:");
    scanf("%s", stemp->num);
    printf("姓名:");
    scanf("%s", stemp->name);
    printf("性别:");
    scanf("%s", stemp->sex);
    printf("成绩:");
    scanf("%f", &stemp->score);
}

int main()
{
  List *L;
  int i, pos, maxsize;
  int loc = 0;
  char sf;
  char num[10];
  T*  stemp;
  stemp = (T *)malloc(sizeof(T));
  L = initial();
  maxsize = MaxSize;

  CreateList(L, maxsize);

  printf("请输入所选择的功能代码:\n");
  printf("1-Append   2-Show   3-Insert  4-Remove  5-Replace \n");
  printf("6-find  7-Locate 0-Exit\n");
  scanf("%d", &i);
  do{
    switch(i) {
      case 1:
          printf("请输入学生信息:\n");
          input(stemp);
          if (Append(L,*stemp)==TRUE) {
              printf("添加数据成功!");
          }
          else {
              printf("添加数据失败!");
          }
          break;
      case 2:
          Show(L);
          break;
      case 3:
          printf("您要在哪个位置插入记录?");
          scanf("%d",&pos);
          printf("请输入您要插入的学生记录:\n");
          printf("请输入学生信息:\n");
          input(stemp);
          Insert( L, pos, *stemp );
          Show(L);
          break;
      case 4:
           printf("请输入要删除学生的位置:\n");
           scanf("%d", &loc);
           Remove( L, loc );
           Show( L );
           break;
      case 5:
            printf("请输入您要替换的位置:\n");
            scanf("%d", &loc);
            input(stemp);
            Replace( L, loc, *stemp );
            Show(L);
            break;
      case 6:
            printf("请输入要查找第几个学生的信息:\n");
            scanf("%d", &loc);
            Find( L, loc-1 );
            output(L, loc-1);
            break;
      case 7:
            printf("请输入要查找学生的学号:\n");
            scanf("%s", num);
            Loc(L, num);
      default:break;
    }
      if (i!=0){
          printf("是否继续?(Y/N)");
          getchar();
          scanf("%c", &sf);
          if (sf=='N'||sf=='n') {
                break;
          }
          printf("请输入所选择的功能代码:\n");
          scanf("%d",&i);
      }
  }while(i);
  return 0;
}


作者:wangwenhao00 发表于2013-1-8 16:27:57 原文链接
阅读:44 评论:0 查看评论

    
最新技术文章:
▪error while loading shared libraries的解決方法    ▪版本控制的极佳实践    ▪安装多个jdk,多个tomcat版本的冲突问题
▪简单选择排序算法    ▪国外 Android资源大集合 和个人学习android收藏    ▪.NET MVC 给loading数据加 ajax 等待loading效果
▪http代理工作原理(3)    ▪关注细节-TWaver Android    ▪Spring怎样把Bean实例暴露出来?
▪java写入excel2007的操作    ▪http代理工作原理(1)    ▪浅谈三层架构
▪http代理工作原理(2)    ▪解析三层架构……如何分层?    ▪linux PS命令
▪secureMRT Linux命令汉字出现乱码    ▪把C++类成员方法直接作为线程回调函数    ▪weak-and算法原理演示(wand)
▪53个要点提高PHP编程效率    ▪linux僵尸进程    ▪java 序列化到mysql数据库中
▪利用ndk编译ffmpeg    ▪活用CSS巧妙解决超长文本内容显示问题    ▪通过DBMS_RANDOM得到随机
▪CodeSmith 使用教程(8): CodeTemplate对象    ▪android4.0 进程回收机制    ▪仿天猫首页-产品分类
▪从Samples中入门IOS开发(四)------ 基于socket的...    ▪工作趣事 之 重装服务器后的网站不能正常访...    ▪java序列化学习笔记
▪Office 2010下VBA Addressof的应用    ▪一起来学ASP.NET Ajax(二)之初识ASP.NET Ajax    ▪更改CentOS yum 源为163的源
▪ORACLE 常用表达式    ▪记录一下,AS3反射功能的实现方法    ▪u盘文件系统问题
▪java设计模式-观察者模式初探    ▪MANIFEST.MF格式总结    ▪Android 4.2 Wifi Display核心分析 (一)
▪Perl 正则表达式 记忆方法    ▪.NET MVC 给loading数据加 ajax 等待laoding效果    ▪java 类之访问权限
▪extjs在myeclipse提示    ▪xml不提示问题    ▪Android应用程序运行的性能设计
▪sharepoint 2010 自定义列表启用版本记录控制 如...    ▪解决UIScrollView截获touch事件的一个极其简单有...    ▪Chain of Responsibility -- 责任链模式
▪运行skyeye缺少libbfd-2.18.50.0.2.20071001.so问题    ▪sharepoint 2010 使用sharepoint脚本STSNavigate方法实...    ▪让javascript显原型!
▪kohana基本安装配置    ▪MVVM开发模式实例解析    ▪sharepoint 2010 设置pdf文件在浏览器中访问
▪spring+hibernate+事务    ▪MyEclipse中文乱码,编码格式设置,文件编码格...    ▪struts+spring+hibernate用jquery实现数据分页异步加...
▪windows平台c++开发"麻烦"总结    ▪Android Wifi几点    ▪Myeclipse中JDBC连接池的配置
▪优化后的冒泡排序算法    ▪elasticsearch RESTful搜索引擎-(java jest 使用[入门])...    ▪MyEclipse下安装SVN插件SubEclipse的方法
▪100个windows平台C++开发错误之七编程    ▪串口转以太网模块WIZ140SR/WIZ145SR 数据手册(版...    ▪初识XML(三)Schema
▪Deep Copy VS Shallow Copy    ▪iphone游戏开发之cocos2d (七) 自定义精灵类,实...    ▪100个windows平台C++开发错误之八编程
▪C++程序的内存布局    ▪将不确定变为确定系列~Linq的批量操作靠的住...    ▪DIV始终保持在浏览器中央,兼容各浏览器版本
▪Activity生命周期管理之三——Stopping或者Restarti...    ▪《C语言参悟之旅》-读书笔记(八)    ▪C++函数参数小结
▪android Content Provider详解九    ▪简单的图片无缝滚动效果    ▪required artifact is missing.
▪c++编程风格----读书笔记(1)    ▪codeforces round 160    ▪【Visual C++】游戏开发笔记四十 浅墨DirectX教程...
HTML标签参考手册 iis7站长之家
▪Android窗口管理服务WindowManagerService计算Activity...    ▪keytool 错误: java.io.FileNotFoundException: MyAndroidKey....    ▪《HTTP权威指南》读书笔记---缓存
▪markdown    ▪[设计模式]总结    ▪网站用户行为分析在用户市场领域的应用
 


站内导航:


特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

©2012-2021,,E-mail:www_#163.com(请将#改为@)

浙ICP备11055608号-3