几何尺寸与公差论坛

 找回密码
 注册
查看: 2129|回复: 3

使用c#设置系统时间(不同于以往的文章,是经过测试的)

[复制链接]
发表于 2010-4-15 00:26:22 | 显示全部楼层 |阅读模式
http://blog.csdn.net/jingang123gz/archive/2008/07/14/2649755.aspx
using System;
using System.Drawing;
using System.Collections;
using System.ComponentModel;
using System.Windows.Forms;
using System.Data;
using System.Runtime.InteropServices;

namespace WindowsApplication1
{
  [StructLayout(LayoutKind.Sequential)]
  public struct SystemTime
  {
    public ushort wYear;
    public ushort wMonth;
    public ushort wDayOfWeek;
    public ushort wDay;
    public ushort wHour;
    public ushort wMinute;
    public ushort wSecond;
    public ushort wMiliseconds;
  }

  public class Win32
  {
    [DllImport("Kernel32.dll")]
    public static extern bool SetSystemTime( ref SystemTime sysTime );
    [DllImport("Kernel32.dll")]
    public static extern void GetSystemTime(ref SystemTime sysTime);
  }


/// <summary>
/// Form1 的摘要说明。
/// </summary>
public class Form1 : System.Windows.Forms.Form
{
    private System.Windows.Forms.Button button1;
    private System.Windows.Forms.TextBox textBox1;
    private System.Windows.Forms.TextBox textBox2;
  /// <summary>
  /// 必需的设计器变量。
  /// </summary>
  private System.ComponentModel.Container components = null;

  public Form1()
  {
   //
   // Windows 窗体设计器支持所必需的
   //
   InitializeComponent();

   //
   // TODO: 在 InitializeComponent 调用后添加任何构造函数代码
   //
  }

  /// <summary>
  /// 清理所有正在使用的资源。
  /// </summary>
  protected override void Dispose( bool disposing )
  {
   if( disposing )
   {
    if (components != null)
    {
     components.Dispose();
    }
   }
   base.Dispose( disposing );
  }

  #region Windows 窗体设计器生成的代码
  /// <summary>
  /// 设计器支持所需的方法 - 不要使用代码编辑器修改
  /// 此方法的内容。
  /// </summary>
  private void InitializeComponent()
  {
      this.button1 = new System.Windows.Forms.Button();
      this.textBox1 = new System.Windows.Forms.TextBox();
      this.textBox2 = new System.Windows.Forms.TextBox();
      this.SuspendLayout();
      //
      // button1
      //
      this.button1.Location = new System.Drawing.Point(188, 174);
      this.button1.Name = "button1";
      this.button1.TabIndex = 0;
      this.button1.Text = "button1";
      this.button1.Click += new System.EventHandler(this.button1_Click);
      //
      // textBox1
      //
      this.textBox1.Location = new System.Drawing.Point(56, 12);
      this.textBox1.Name = "textBox1";
      this.textBox1.Size = new System.Drawing.Size(510, 21);
      this.textBox1.TabIndex = 1;
      this.textBox1.Text = "textBox1";
      //
      // textBox2
      //
      this.textBox2.Location = new System.Drawing.Point(58, 50);
      this.textBox2.Name = "textBox2";
      this.textBox2.Size = new System.Drawing.Size(506, 21);
      this.textBox2.TabIndex = 2;
      this.textBox2.Text = "textBox2";
      //
      // Form1
      //
      this.AutoScaleBaseSize = new System.Drawing.Size(6, 14);
      this.ClientSize = new System.Drawing.Size(602, 273);
      this.Controls.Add(this.textBox2);
      this.Controls.Add(this.textBox1);
      this.Controls.Add(this.button1);
      this.Name = "Form1";
      this.Text = "Form1";
      this.ResumeLayout(false);

    }
  #endregion

  /// <summary>
  /// 应用程序的主入口点。
  /// </summary>
  [STAThread]
  static void Main()
  {
   Application.Run(new Form1());
  }

    private void button1_Click(object sender, System.EventArgs e)
    {
      textBox1.Text = DateTime.Now.ToLongDateString() + DateTime.Now.ToLongTimeString();
      SystemTime sysTime = new SystemTime();

      sysTime.wYear = Convert.ToUInt16(DateTime.Now.Year);
      sysTime.wMonth = Convert.ToUInt16(DateTime.Now.Month);
      //处置北京时间
      int nBeijingHour = DateTime.Now.Hour - 8;
      if (nBeijingHour <= 0)
      {
        nBeijingHour += 24;
        sysTime.wDay= Convert.ToUInt16(DateTime.Now.Day - 1);
        sysTime.wDayOfWeek = Convert.ToUInt16(DateTime.Now.DayOfWeek - 1);
      }
      else
      {
        sysTime.wDay= Convert.ToUInt16(DateTime.Now.Day);
        sysTime.wDayOfWeek = Convert.ToUInt16(DateTime.Now.DayOfWeek);
      }
      sysTime.wHour = Convert.ToUInt16(nBeijingHour);
      sysTime.wMinute = Convert.ToUInt16(DateTime.Now.Minute);
      sysTime.wSecond = Convert.ToUInt16(DateTime.Now.Second);
      sysTime.wMiliseconds = Convert.ToUInt16(DateTime.Now.Millisecond);
  
      Win32.SetSystemTime(ref sysTime);
      textBox2.Text = DateTime.Now.ToLongDateString() + DateTime.Now.ToLongTimeString();
    }


}
}
 楼主| 发表于 2010-4-15 00:29:37 | 显示全部楼层

回复: 使用c#设置系统时间(不同于以往的文章,是经过测试的)

NET并没有提供可以修改系统时间的名字空间(namespace),您可以通过Win32   API的SetSystemTime   API函数来设置系统时间:     
   
  using   System;     
  using   System.Runtime.InteropServices;     
   
  [StructLayout(LayoutKind.Sequential)]     
  public   struct   SystemTime     
  {     
  public   ushort   wYear;     
  public   ushort   wMonth;     
  public   ushort   wDayOfWeek;     
  public   ushort   wDay;     
  public   ushort   wHour;     
  public   ushort   wMinute;     
  public   ushort   wSecond;     
  public   ushort   wMiliseconds;     
  }     
   
  public   class   Win32     
  {     
  [DllImport("Kernel32.dll")]     
  public   static   extern   bool   SetSystemTime(   ref   SystemTime   sysTime   );     
  [DllImport("Kernel32.dll")]     
  public   static   extern   void   GetSystemTime(ref   SystemTime   sysTime);     
  }     
   
  public   class   TestPInvoke     
  {     
  public   static   void   Main()     
  {     
  SystemTime   sysTime   =   new   SystemTime();     
   
  sysTime.wYear   =   2002;     
  sysTime.wMonth=1;     
  sysTime.wDay=1;     
  sysTime.wDayOfWeek=1;     
  sysTime.wHour=1;     
  sysTime.wMinute=1;     
  sysTime.wSecond=1;     
  sysTime.wMiliseconds=1;     
   
  Win32.SetSystemTime(ref   sysTime);     
  }     
  }
 楼主| 发表于 2010-4-15 00:30:47 | 显示全部楼层

回复: 使用c#设置系统时间(不同于以往的文章,是经过测试的)

To   credream(阿蒙):   
   
  你在那个地方?应该是9点才是.不是北京时间吗?   
   
  忘记和你说了,这个SetSystemTime使用的是UTC时间(0时区).你要根据这个原则自己修改时间.   
   
   
  The   SetSystemTime   function   sets   the   current   system   time   and   date.   The   system   time   is   expressed   in   Coordinated   Universal   Time   (UTC).   
   
   
  参考MSDN:   
  http://msdn.microsoft.com/librar ... e/setsystemtime.asp
 楼主| 发表于 2010-4-15 00:35:19 | 显示全部楼层

回复: 使用c#设置系统时间(不同于以往的文章,是经过测试的)

种方法是调用Win32   API   SetSystemTime.   
   
  using   System.Runtime   .InteropServices   ;   
  [   StructLayout(   LayoutKind.Sequential   )]   
  public   class   SystemTime     
  {   
  public   ushort   year;     
  public   ushort   month;     
  public   ushort   dayOfWeek;     
  public   ushort   day;     
  public   ushort   hour;     
  public   ushort   minute;     
  public   ushort   second;     
  public   ushort   milliseconds;     
   
  }   
   
  class   MainClass   
  {   
  [   DllImport(   "Kernel32.dll"   )]   
  public   static   extern   void   GetSystemTime(   [In,Out]   SystemTime   st   );   
   
  [   DllImport(   "Kernel32.dll"   )]   
  public   static   extern   bool   SetSystemTime(   [In,Out]   SystemTime   st   );   
  public   static   void   Main(string[]   args)   
  {   
   
            SystemTime   st=new   SystemTime   ();   
   
            GetSystemTime(st);   
   
            st.year   +=1;   
            bool   result=SetSystemTime(st);   
  }   
  }   
                        
  微软亚洲技术中心   VC技术支持
您需要登录后才可以回帖 登录 | 注册

本版积分规则

QQ|Archiver|小黑屋|几何尺寸与公差论坛

GMT+8, 2024-9-28 05:05 , Processed in 0.040986 second(s), 19 queries .

Powered by Discuz! X3.4 Licensed

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表